2010-06-18 6 views
12

Dispatcher을 사용할시기와 SynchronizationContext 클래스를 사용하는시기를 말해 줄 수 있습니까?Dispatcher 및 SynchronizationContext 클래스

잠시 동안 Dispatcher을 사용하여 백그라운드 스레드의 작업을 큐에 넣은 다음 SynchronizationContext을 발견했습니다. WPF 사용시

답변

16

AFAIK는, 상기 오브젝트 SynchronizationContext.Current 실제로 디스패처 오브젝트 주위 단지 래퍼와 PostSend 및 방법은 단지 Dispatcher.BeginInvokeDispatcher.Invoke 위임이다 DispatcherSynchronizationContext 형이다.

그래도 SynchronizationContext을 사용하기로 결정한 경우에도 배후에서 배정 담당자를 호출하게 될 것입니다.

게다가 UI에 호출해야하는 모든 스레드에 대한 현재 컨텍스트에 대한 참조를 전달해야하므로 SynchronizationContext를 사용하는 것이 약간 번거롭다 고 생각합니다.

+3

왜 downvote입니까? –

4
  1. 코드가 WPF와 밀접하게 결합 된 경우 Dispatcher를 사용하십시오.

  2. '컨텍스트'스레드에 항목을 대기시켜야 할 때 AsyncOperationManager를 사용하십시오. 이것은 Windows Forms, ASP .NET 및 WCF 응용 프로그램에서도 작동합니다.

  3. 직접 SynchronizationContext를 사용하지 마십시오. AsyncOperationManager는이 방법을 내부적으로 사용합니다.

+0

나는 당신이이 대답을 얼마 전에 작성했다는 것을 알고 있습니다. 그럼에도 불구하고 "AsyncOperationManager"를 사용하여 "컨텍스트"(UI) 스레드에서 실행을 위해 델리게이트를 대기시키는 방법을 구체적인 예제로 제공 할 수 있다면 매우 흥미가있을 것입니다. 나는'SynchronizationContext'가 어떻게 작동 하는지를 안다; 하지만 'AsyncOperation'이 어떻게 작동하는지 생각할 수 없습니다. (저는 현재 비동기 작업의 상태와 진행 상황을 추적하는 "토큰"과 비슷하지만 실제로 대리자의 실행을 예약하는 데 도움이되지 않는다는 개념을 가지고 있습니다.) – stakx

+1

AsyncOperationManager 사용 방법 : http : // www .codeproject.com/KB/cpp/SyncContextTutorial.aspx – jbe

+0

UI 스레드에서 동기식 실행이 필요한 경우 어떻게해야합니까? AsyncOperation에는 Send() 메서드가 없지만 SynchronizationContext에는 있습니다. – Monstieur

관련 문제