2013-03-02 2 views
0

C# WPF 프로젝트에서 일부 UserControls를 새로 고쳐야하는 백그라운드 스레드가 있습니다.Dispatcher.Invoke의 코드가 실행될 때?

Dispatcher.Invoke(DispatcherPriority.Normal, (MethodInvoker)delegate() 
    { 
     // Code 
    } 

하지만 궁금하네요 :

  • 대리자 내부의 코드는 주 스레드에서 실행됩니다 때 나는 Dispatcher.Invoke를 사용하는 것이 일을하려면 ?
  • 실행하려면 주 스레드에서 정상적으로 실행되는 방법을 중지 할 수 있습니까?
  • Dispatcher.Invoke를 사용하면 경쟁 조건이 발생할 수 있습니까?

고마워,

+0

이 코드는 메인 UI 스레드에서 실행되지만 남은 질문에 현명하게 대답 할 수 있도록 시도하려는 내용 (또는보고있는 문제점)에 대해 자세히 알아야합니다. – ChrisF

답변

2

?

위임자는 모두 operations with priority greater than Normal got a chance to execute 인 경우 주 스레드에서 한 번 실행됩니다.

주 스레드에서 정상적으로 실행되는 방법은 이 중지 될 수 있습니까?

Invoke 메서드 대리자가 주 스레드에서 동 기적으로 실행되도록 설정하지만 비동기 적으로 실행하려면 BeginInvoke를 사용해야합니다. 일부 대리인이 주 스레드에서 실행중인 경우 delegate will get queued and will run once executing operation gets completed. 그러나, 대리인이 실행되지 않으면 백그라운드 스레드가 앞으로 이동하지 않습니다.

경합 조건으로 Dispatcher.Invoke를 사용할 수 있습니까?

No 때문에 위임자가 배정 대기열에서 대기열에 포함 된 이후로는 전송되지 않습니다.

+0

당신이 문장의 두 번째 부분에서 ** 동 기적으로 ** 의미한다고 생각합니다. –

+0

@Ravadre - 예 감사합니다 .. 업데이트되었습니다! –

0
  1. UI 스레드가 SynchronizationContext.Send 호출 실행을 전환 할 수 있습니다 정확히 에마.
  2. 주 스레드에서 정상적으로 실행되는 방법을 실행하면 (yield 또는 await과 같은 다른 의사 비 완료 조건 포함) 실행이 완료되고 함수가 실행됩니다.
  3. 호 대리인 내부 코드는 메인 스레드상에서 실행될 것이다
관련 문제