.NET 3.5 및 WPF의 Dispatcher 개념은 .NET 2.0의 백그라운드 스레드와 어떻게 다릅니 까? 아래 문 사이에 차이가 무슨 예를 들어Dispatcher가 백그라운드 스레드와 다른 점은 무엇입니까?
:
delegate.Invoke/BeginInvoke
및 발송자가 이벤트로 전송 대기열로 생각 될 수있다
this.dispatcher.Invoke/BeginInvoke
.NET 3.5 및 WPF의 Dispatcher 개념은 .NET 2.0의 백그라운드 스레드와 어떻게 다릅니 까? 아래 문 사이에 차이가 무슨 예를 들어Dispatcher가 백그라운드 스레드와 다른 점은 무엇입니까?
:
delegate.Invoke/BeginInvoke
및 발송자가 이벤트로 전송 대기열로 생각 될 수있다
this.dispatcher.Invoke/BeginInvoke
; 디스패처는 UI 스레드에서 실행되고 UI에 대한 이벤트를 실행합니다. 윈도우에서 UI 컨트롤은 UI 스레드를 생성 한 스레드에 의해서만 수정 될 수 있으므로 UI 변경 사항은 UI 스레드에서 수행되어야합니다. 따라서 UI 요소를 수정하는 작업을 UI에 보내야하는 중요한 이유 중 하나입니다 디스패처.
백그라운드 스레드는 UI와는 다른 스레드입니다. 따라서 이러한 스레드 중 하나에서 실행되는 내용은 UI에 영향을 미치지 않거나 차단하지 않습니다.
Dispatcher를 사용하여 장기 실행 작업을 실행하면 현재 작업과 다른 우선 순위로 UI 스레드에서 실행됩니다. 여기서 문제는 대개 가능한 한 많은 대역폭을 갖는 장기 실행 작업을 원한다는 것입니다. 운영자 아래에서 실행하면 UI가 조절됩니다.
Dispatcher의 포인트는 백그라운드 스레드의 앵커를 다시 UI에 제공하여 사용자가 작업 진행 상황에 대한 UI를 업데이트 할 수 있도록하는 것입니다.
백그라운드에서 작업을 실행하고 실행을 UI에 연기하려면 배경 작업자 또는 새 작업 라이브러리를 사용하십시오. Dispatcher를 사용하여 업데이트를 UI로 다시 마샬링합니다.
BeginInvoke 및 Invoke의 개념은 다음과 같이 생각할 수 있습니다.
이제는 디스패처 및 백그라운드 스레드와 관련이있는 또 다른 문제입니다. Justin은 Dispatcher가 UI 스레드가 유휴 상태가 될 때마다 수행 할 작업 큐를 처리한다고 말합니다. Dispatcher에서 BeginInvoke를 호출하는 백그라운드 스레드는 처리를 시작하지 않았더라도 즉시 반환됩니다. Invoke가 대신 사용 된 경우 UI 스레드가 처리를 완료 할 때까지 백그라운드 스레드가 차단됩니다. Silverlight에서는 Dispatcher에 대한 호출이 없으므로 대부분의 경우 UI 스레드가 작업을 처리하는 동안 백그라운드 스레드가 블로킹되는 것을 원하지 않을 수 있습니다.
반대로 Delegate.BeginInvoke는 스레드 풀에서 작업자 스레드를 사용합니다. UI 스레드 (또는 실제로 스레드)에서 BeginInvoke를 호출하고 대리자를 호출 할 수 있습니다. BeginInvoke는 위에서 설명한 동일한 의미를 사용하여 대리자를 호출하기 위해 작업자 스레드를 사용합니다. 그러나 Invoke는 다른 스레드를 사용하지 않습니다. 호출하는 스레드의 컨텍스트에서 동 기적으로 대리인을 호출하고 완료되면 반환합니다.
스레드간에 동기 실행을 사용할 때는주의해야합니다. 매우주의하지 않으면 교착 상태가 발생하기 쉽습니다.
두 메소드에서 호출 한 작업은 UI 스레드에서 실행될 이벤트 대기열에 배치됩니다. 호출은 동 기적으로 발생하며 작업이 완료 될 때까지 차단됩니다. BeginInvoke는 비동기 적으로 발생하여 호출하는 메소드가 계속 실행되도록합니다.