WPF에서 Dispatcher Invoke와 BeginInvoke 차이점은?

안녕하세요. :smile:

WPF에서 Dispatcher를 사용할 때 Invoke또는 BeginInvoke 두 방식이 있는 것으로 알고 있는데요.

아직 이 부분을 온전히 이해하기가 힘이 드네요.
비동기, 동기, 쓰레드 같은 개념들을 제대로 이해하지 못한 것도 영향이 큰 것 같습니다.

그래도 Invoke, BeginInvoke를 최대한 잘 이해해보고자 질문을 드립니다.

이를 사용함에 있어 적절한 예시 또는 상황을 토대로 이론적인 설명( Easy :smile: )도 듣고 싶습니다.

읽어주셔서 감사합니다!

좋아요 2

Invoke / BeginInvoke 키워드에서도 알 수 있듯이

동기로 이벤트 루프를 처리를 요청하느냐 / 비동기로 요청하느냐의 차이 입니다.

윈폼에서는 같은 메서드로 Control.Invoke / BeginInvoke가 있는데요

Invoke로 이벤트 루프 처리 요청을 하면 SynchronizationContext를 통해 Get 으로 호출되게 됩니다.
반면
BeginInvoke로 요청을 하게 되면 Post로 호출되어 ThreadPool 에서 처리 되어 집니다.

좋아요 3

답변에 잘못된 점이 있습니다. BeginInvoke로 요청을 하게 되면 Post로 호출되는 것은 맞지만 ThreadPool에서 처리되는 것은 아닙니다. SynchronizationContext가 없는 경우에는 ThreadPool에서 처리되겠지만 이 질문에서처럼 WPF나 WinForm의 문맥이라면 해당 UI 요소를 생성한 스레드에서 처리가 되는 것이 맞습니다. 관련해서 다음의 글을 참고하세요.

.NET Framework: 777. UI 요소의 접근은 반드시 그 UI를 만든 스레드에서! (sysnet.pe.kr)

.NET Framework: 911. Console/Service Application을 위한 SynchronizationContext - AsyncContext (sysnet.pe.kr)

좋아요 3

잘못된 내용 집어주셔서 감사합니다.!

좋아요 2