2010-03-29 2 views

답변

6

; 디스패처는 UI 스레드에서 실행되고 UI에 대한 이벤트를 실행합니다. 윈도우에서 UI 컨트롤은 UI 스레드를 생성 한 스레드에 의해서만 수정 될 수 있으므로 UI ​​변경 사항은 UI 스레드에서 수행되어야합니다. 따라서 UI 요소를 수정하는 작업을 UI에 보내야하는 중요한 이유 중 하나입니다 디스패처.

백그라운드 스레드는 UI와는 다른 스레드입니다. 따라서 이러한 스레드 중 하나에서 실행되는 내용은 UI에 영향을 미치지 않거나 차단하지 않습니다.

0

Dispatcher를 사용하여 장기 실행 작업을 실행하면 현재 작업과 다른 우선 순위로 UI 스레드에서 실행됩니다. 여기서 문제는 대개 가능한 한 많은 대역폭을 갖는 장기 실행 작업을 원한다는 것입니다. 운영자 아래에서 실행하면 UI가 조절됩니다.

Dispatcher의 포인트는 백그라운드 스레드의 앵커를 다시 UI에 제공하여 사용자가 작업 진행 상황에 대한 UI를 업데이트 할 수 있도록하는 것입니다.

백그라운드에서 작업을 실행하고 실행을 UI에 연기하려면 배경 작업자 또는 새 작업 라이브러리를 사용하십시오. Dispatcher를 사용하여 업데이트를 UI로 다시 마샬링합니다.

2

BeginInvoke 및 Invoke의 개념은 다음과 같이 생각할 수 있습니다.

  • BeginInvoke 의미 : "..이 작업을 수행하고 내가 하나가 반환 값에 대해 걱정하지 않는다 또는 미래의 어떤 시점에서 다시이 주소에서 저를 호출 할 수 있습니다를 완료하기 전에 반환"
  • Invoke means : "이것을 수행하면 여기 앉아서 완료 될 때까지 기다릴 것입니다."

이제는 디스패처 및 백그라운드 스레드와 관련이있는 또 다른 문제입니다. Justin은 Dispatcher가 UI 스레드가 유휴 상태가 될 때마다 수행 할 작업 큐를 처리한다고 말합니다. Dispatcher에서 BeginInvoke를 호출하는 백그라운드 스레드는 처리를 시작하지 않았더라도 즉시 반환됩니다. Invoke가 대신 사용 된 경우 UI 스레드가 처리를 완료 할 때까지 백그라운드 스레드가 차단됩니다. Silverlight에서는 Dispatcher에 대한 호출이 없으므로 대부분의 경우 UI 스레드가 작업을 처리하는 동안 백그라운드 스레드가 블로킹되는 것을 원하지 않을 수 있습니다.

반대로 Delegate.BeginInvoke는 스레드 풀에서 작업자 스레드를 사용합니다. UI 스레드 (또는 실제로 스레드)에서 BeginInvoke를 호출하고 대리자를 호출 할 수 있습니다. BeginInvoke는 위에서 설명한 동일한 의미를 사용하여 대리자를 호출하기 위해 작업자 스레드를 사용합니다. 그러나 Invoke는 다른 스레드를 사용하지 않습니다. 호출하는 스레드의 컨텍스트에서 동 기적으로 대리인을 호출하고 완료되면 반환합니다.

스레드간에 동기 실행을 사용할 때는주의해야합니다. 매우주의하지 않으면 교착 상태가 발생하기 쉽습니다.

0

두 메소드에서 호출 한 작업은 UI 스레드에서 실행될 이벤트 대기열에 배치됩니다. 호출은 동 기적으로 발생하며 작업이 완료 될 때까지 차단됩니다. BeginInvoke는 비동기 적으로 발생하여 호출하는 메소드가 계속 실행되도록합니다.

관련 문제