Microsoft MVP성태의 닷넷 이야기
Dispatcher 서비스 구현 질문 [링크 복사], [링크+제목 복사],
조회: 12777
글쓴 사람
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)
5889전예찬4/14/202311726C# 파일 복사 관련 질문 드립니다. [3]
5888정경구4/12/202311889C# 첫 환경 세팅과 관련해서 [4]
5887HAN4/12/202311907안녕하세요 파이썬도 공유 가능 할까요? [1]
5886guest4/11/202313563필요한 어셈블리만 다운로드 및 재로딩하는 방법에 관하여 [2]
5885guest4/11/202312014c#으로 드림위버같은 거 만들어볼려는데요 [6]
5884궁금이4/11/202312252부모 클래스에서 예외 발생시 힙 영역에 할당 ? [2]
5883코딩초짜4/9/20231190910c언어 usleep 에 대해서 요 [2]
5882조은현4/7/202311302선생님 안녕하세요! wpf의 성능 개선에 대해서 질문드려요! [1]파일 다운로드1
5881guest4/6/202312308static method - <에러메시지 Extension method must be defined in a non-generic static class> [4]
5880유비4/4/202311475WPF DataGrid CollectionView, IEditableCollectionView 관련 문의 [1]
5879guest4/4/202313092Async method의 에러 표시 [3]
5878guest4/3/202313377C#으로 CMOS 설정 변경가능한지요? [4]
5875guest4/2/202313727성태님 책을 완독 하고 Static [7]
5874민성4/1/202312485안녕하세요 질문 하나만 드릴깨요~ [1]
5873guest3/31/202313498제어판에서 삭제불가 MS Edge ---> 레지스트리 편집기에서도 안보임 [6]파일 다운로드1
58723/31/202312766web config 파일 확인부탁드려요 [6]
58713/31/202312253web config 파일 수정이요 [2]파일 다운로드1
5870guest3/30/202312206.NET Core SDK 삭제 시 주의 사항 [4]파일 다운로드1
5869guest3/30/202312728Dictionary의 Update 그리고 Foreach [7]
5868guest3/29/202311975Speech Recognition과 Form1 그리고 정확도 [4]파일 다운로드1
5866월급쟁이3/28/202311646cmake 크로스 컴파일 관련하여 질문이 있습니다 [1]
5865guest3/28/202311622Github Copilot과 코딩실력 향상? [1]
5864guest3/27/202312702System.NullReferenceException - 개체참조가 개체의 인스턴스... [6]파일 다운로드1
5863guest3/24/202311891이벤트 핸들러 사라짐 현상 - Button [4]
5862guest3/21/202312281세계최초 hts와 싱글스레드 [8]
5861다크파이썬3/21/202313158WPF를 사용하려고 하려고 도서 문의합니다. [2]
1  2  3  [4]  5  6  7  8  9  10  11  12  13  14  15  ...