Microsoft MVP성태의 닷넷 이야기
Dispatcher 서비스 구현 질문 [링크 복사], [링크+제목 복사],
조회: 13814
글쓴 사람
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)
407김용국6/21/200613313                답변글 [답변]: 다시한번 문의드립니다!
398김성호6/17/200613903IE프로그래밍 관련하여 질문이
400정성태6/19/200613671    답변글 [답변]: IE프로그래밍 관련하여 질문이 [5]
396guest6/13/200613472CallByName 을 어떻게 처리해야 할지 ....조언 부탁합니다.
397정성태6/15/200612988    답변글 [답변]: CallByName 을 어떻게 처리해야 할지 ....조언 부탁합니다.
399guest6/19/200612581        답변글 [답변]: [답변]: CallByName 을 어떻게 처리해야 할지 ....조언 부탁합니다.
392이상식6/9/200613425스마트클라이언트 실행환경 관련 질문입니다.
394정성태6/12/200613337    답변글 [답변]: 스마트클라이언트 실행 환경 관련 질문입니다.
395이상식6/12/200613609        답변글 [답변]: [답변]: 스마트클라이언트 실행환경 관련 질문입니다.
391심현철6/9/200613576Win32 platform과 .NET platform간의 성능이 어느정도 차이가 날까요?
393정성태6/12/200613307    답변글 [답변]: Win32 platform과 .NET platform간의 성능이 어느정도 차이가 날까요?
390이현행6/6/200613498정말 답답해서 그렇습니다. [1]
389임경훈6/2/200623374sql과 oracle 사용시 파라메타 차이점
387창민 6/1/200615305안녕하세요.문제가 걸렸는데 해결기미가 안보여서 답답해서.. 혹시 아시면 문제 채질이라도...파일 다운로드1
388정성태6/1/200614906    답변글 [답변]: 안녕하세요.문제가 걸렸는데 해결기미가 안보여서 답답해서.. 혹시 아시면 문제 채질이라도...
385오윤섭5/31/200612562SmartClient 동적호출
386정성태6/1/200613044    답변글 [답변]: SmartClient 동적 호출
380윤용한5/29/200613047ATL Event에서 스크립트가 값을 다시 돌려주는 방법은?파일 다운로드1
381윤용한5/29/200612753    답변글 [답변]: ATL Event에서 스크립트가 값을 다시 돌려주는 방법은?
382윤용한5/29/200613309        답변글 [답변]: [답변]: ATL Event에서 스크립트가 값을 다시 돌려주는 방법은?
383정성태5/30/200613653            답변글 [답변]: [답변]: [답변]: ATL Event에서 스크립트가 값을 다시 돌려주는 방법은?
378guest5/26/200613077managed 와 unmanaged 의 차이가 뭐져?
379정성태5/26/200613353    답변글 [답변]: managed 와 unmanaged 의 차이가 뭐져? [1]
384guest5/30/200612898        답변글 감사합니다.
376노기도5/16/200613085vb6의 GetObjectContext 를 2005에서는 어떻게 사용해야 하나요? [3]
375이덕희5/15/200615296SmartClient 강좌를 보고... 엑박이 나옵니다... [2]파일 다운로드1
... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...