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)

4개의 좋아요

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

2개의 좋아요