Microsoft MVP성태의 닷넷 이야기
Dispatcher 서비스 구현 질문 [링크 복사], [링크+제목 복사],
조회: 3519
글쓴 사람
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분
조각 코드 말고 프로젝트를 압축해서 올려주세요
정성태

1  2  3  4  5  6  7  8  9  10  11  12  [13]  14  15  ...
NoWriterDateCnt.TitleFile(s)
5621장성욱3/8/20224602c# 로그 관련 질문 [1]
5620김민아3/7/20224627안녕하세요 비관리 객체를 반환하는 메소드 호출 시 궁금한 점이 있어서 질문드립니다 [2]
5619팡팡이3/3/20225914RSA 문의드립니다. [3]
5618김기헌3/2/20224490안녕하세요 생성자 옆에 this 키워드를 붙여 생성자를 여러 개 호출 시 질문드립니다 [2]
5617Edun2/25/20224619ArgumentOutOrRangeException에러 발생 [2]파일 다운로드1
5616csha...2/24/20224496readonly struct로 선언된 구조체를 특정 클래스에서 멤버변수로 가지는 경우 [1]
5615장성욱2/22/20226684SetThreadAffinityMask를 이용한 쓰레드 지정하는 방법에 대해 궁금합니다. [4]
5614민우2/22/20225989SSL 통신 문의 [6]
5613김인태2/22/20224562서버와 PC 간의 어플리케이션 성능 차이 [1]
5612팬입니다2/20/20224372Kastrel 서버 관련 [1]
5611차가워2/19/20224596stopWatch 늘어짐 문의 [3]
5610차가워2/18/20224489Stopwatch 늘어짐 문제 [1]
5609cs린이2/15/20224824c# 함수의 호출 방식에 대해 궁금합니다! [2]
5608지호2/10/20225310시작하세요 C# 8.0 중 제네릭타입의 IEnumerable [3]파일 다운로드1
5607이로운2/10/20224582안녕하세요. 궁금한게 있어서 질문드립니다. [1]
5605강성봉2/10/20224597TCP PSH flag 패킷 수신 에러 [1]
5604LW2/9/20224744VISUAL STUDIO 2019 ==> 2020 설치시 오류가 생겨서 문의드립니다. [3]
5603김진명2/9/20225955C# 10.0 출간은 언제쯤 계획하고 계신가요? [1]
5602신갑영2/8/20224819윈폼에 대해서 질문 드립니다. [1]
5601김인태2/4/20225055setup project 관련 [7]
5600itkim2/3/20225848윈도우 서버 계정 패스워드 인증 문의 [5]
5599레드골드2/3/20226300c#으로 ms word 제어 가능할까요? [6]
5598jaew...2/2/20225088Dictionary는 참조형식인가요?? [1]
5597재원2/2/20225393c# 9.0에 대한 내용을 받을 수 있나요? [1]
5596kss1/26/20225127듀얼 모니터 환경에서 wpf 프로그램 크기 변경 [2]
5594mira...1/25/20224785안녕하세요 try~catch 와 SuspendLayout~ResumeLayout 간 호출 문의드립니다! [2]
1  2  3  4  5  6  7  8  9  10  11  12  [13]  14  15  ...