Microsoft MVP성태의 닷넷 이야기
Dispatcher 서비스 구현 질문 [링크 복사], [링크+제목 복사],
조회: 11686
글쓴 사람
guest
홈페이지
첨부 파일
 

안녕하세요 다름이 아니고

WPF Dispatcher 서비스를 구현 중에 의문이 들어서 글을 기재 하게 되었습니다.
코드는 하기와 같은데요,


public static async Task<DispatcherOperation> BeginInvokeBackground(Action action)
{
   
    bool IsRequestedFromMainThread = false;
    try
    {
    if (Application.Current == null)
        return null;

    IsRequestedFromMainThread = Application.Current.Dispatcher.CheckAccess();

    if (IsRequestedFromMainThread == true)
    {
       action.Invoke();
    }
    else
    {
        DispatcherOperation dispatcher = Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, action);

     return await Task.FromResult(dispatcher);
      }
    }
    catch (Exception ex)
    {
        EventLogService.SaveEventLog("DispatcherService/BeginNormal : " + ex.Message, LOG_LEVEL.ERROR);
    }
    return null;
}

위에 코드는 외부에서 Action으로 랩핑 해서 받아서 처리하는 Dispatcher 구문인데
여기서 해당 하는 코드는 Task.FromResult(dispatcher); 입니다.

제가 정성태님 블로그에 "https://www.sysnet.pe.kr/2/0/12713?pageno=0" 참조 해보니
Task.FromResult 동기화 구문이라 외부에서 비동기로 호출 되는 경우 UI 차단 현상이 일어나지 않을가 해서
요 만약 Task.FromResult -> await Task.FromResult(dispatcher); 즉 await를 선언 해준다면 UI 차단 효과를
피해 갈 수 있을가요??

그래서 다음과 같이 바꿔봣는데

public static DispatcherOperation? BeginInvokeBackground(Action action)
{
    bool IsRequestedFromMainThread = false;

    DispatcherOperation? dispatcher = null;
    try
    {
    if (Application.Current == null)
     return null;

    IsRequestedFromMainThread = Application.Current.Dispatcher.CheckAccess();

    if (IsRequestedFromMainThread == true)
    {
     action.Invoke();
    }
    else
    {
        dispatcher = Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, action);
     }
    }
    catch (Exception ex)
    {
        EventLogService.SaveEventLog("DispatcherService/BeginNormal : " + ex.Message, LOG_LEVEL.ERROR);
    }
    return dispatcher;
}

UI 차단 효과도 없을 뿐더러 본래의 Dispatcher 기능을 살려서 사용 하지 않을가 하는데, 잘못된 부분 이나 개선 사항
뭐가 있는지 알려주시면 감사 하겠습니다.








[최초 등록일: ]
[최종 수정일: 4/21/2023]


비밀번호

댓글 작성자
 



2023-04-21 11시29분
조각 코드 말고 프로젝트를 압축해서 올려주세요
정성태

... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
406이진형6/21/200613879처음에 스마트클라이언트 로딩하는 속도 [1]
4036/20/200612701Invoke 관련 문의 드립니다. [2]
4086/22/200611591    답변글 invoke 관련하여...
401김용국6/19/200612562SmartClient에서 동적 어셈블리 관련 문의 드립니다 [1]
402김용국6/20/200611714    답변글 [답변]: SmartClient에서 동적 어셈블리 관련 문의 드립니다 ... 다시 문의 드립니다! [1]
404김용국6/20/200611828        답변글 [답변]: [답변]: SmartClient에서 동적 어셈블리 관련 문의 드립니다 ... 다시 문의 드립니다! [1]
405김용국6/21/200612314            답변글 잘 되네요~~ ^^ 고맙습니다!
407김용국6/21/200611709                답변글 [답변]: 다시한번 문의드립니다!
398김성호6/17/200612246IE프로그래밍 관련하여 질문이
400정성태6/19/200611924    답변글 [답변]: IE프로그래밍 관련하여 질문이 [5]
396guest6/13/200611792CallByName 을 어떻게 처리해야 할지 ....조언 부탁합니다.
397정성태6/15/200611456    답변글 [답변]: CallByName 을 어떻게 처리해야 할지 ....조언 부탁합니다.
399guest6/19/200611096        답변글 [답변]: [답변]: CallByName 을 어떻게 처리해야 할지 ....조언 부탁합니다.
392이상식6/9/200611925스마트클라이언트 실행환경 관련 질문입니다.
394정성태6/12/200611771    답변글 [답변]: 스마트클라이언트 실행 환경 관련 질문입니다.
395이상식6/12/200612126        답변글 [답변]: [답변]: 스마트클라이언트 실행환경 관련 질문입니다.
391심현철6/9/200612025Win32 platform과 .NET platform간의 성능이 어느정도 차이가 날까요?
393정성태6/12/200611683    답변글 [답변]: Win32 platform과 .NET platform간의 성능이 어느정도 차이가 날까요?
390이현행6/6/200611910정말 답답해서 그렇습니다. [1]
389임경훈6/2/200621807sql과 oracle 사용시 파라메타 차이점
387창민 6/1/200613716안녕하세요.문제가 걸렸는데 해결기미가 안보여서 답답해서.. 혹시 아시면 문제 채질이라도...파일 다운로드1
388정성태6/1/200613291    답변글 [답변]: 안녕하세요.문제가 걸렸는데 해결기미가 안보여서 답답해서.. 혹시 아시면 문제 채질이라도...
385오윤섭5/31/200611022SmartClient 동적호출
386정성태6/1/200611417    답변글 [답변]: SmartClient 동적 호출
380윤용한5/29/200611524ATL Event에서 스크립트가 값을 다시 돌려주는 방법은?파일 다운로드1
381윤용한5/29/200611154    답변글 [답변]: ATL Event에서 스크립트가 값을 다시 돌려주는 방법은?
... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...