Dispatcher.CurrentDispatcher
(in System.Windows.Threading
)과 Application.Current.Dispatcher
(in System.Windows
) 의 차이점은 무엇입니까 ?
내 직감은 Application.Current.Dispatcher
변경되지 않고 현재 응용 프로그램의 모든 스레드에 전역 적 Dispatcher.CurrentDispatcher
이며 Dispatcher
호출 된 스레드 에 따라 의 새 인스턴스를 만들 수 있다고 말합니다.
그 맞습니까?
그렇다면 Dispatcher.CurrentDispatcher
주로 다중 스레드 UI를위한 목적 입니까?
답변
내 직감에 따르면 Application.Current.Dispatcher는 변경되지 않고 현재 응용 프로그램의 모든 스레드에 전역 적이며 Dispatcher.CurrentDispatcher는 호출 된 스레드에 따라 Dispatcher의 새 인스턴스를 만들 수 있습니다.
맞아요.
또한 Dispatcher.CurrentDispatcher
비 UI 스레드 에서 액세스 하는 데 아무런 의미가 없습니다 . 를 호출하지 않으면 아무것도하지 않으며 Dispatcher.Run
무한 메시지 루프로 들어가는 것은 작업자 스레드 내에서 수행하려는 작업이 아닙니다.
그래서:
-
가장 일반적인 시나리오에서는 앱이 단 하나의 UI 스레드를 가지고,
Application.Current.Dispatcher
및Dispatcher.CurrentDispatcher
UI 스레드 내에서 동일한 인스턴스를 반환합니다. 사용하는 것은 단순히 선호도의 문제입니다. -
앱에 둘 이상의 UI 스레드가있는 경우 각
DispatcherObject
스레드는 생성시 생성 된 UI 스레드의 디스패처와 영구적으로 연결됩니다. 이 경우Application.Current.Dispatcher
애플리케이션이 생성 된 스레드의 디스패처를 참조합니다. 다른 UI 스레드가 소유 한 컨트롤에 메시지를 게시하는 데 사용할 수 없습니다.
답변
간단히 말해서 …
Dispatcher.CurrentDispatcher
현재 스레드 의 디스패처 를 가져옵니다 . 따라서 백그라운드 프로세스에서 UI 스레드의 Dispatcher를 찾고 있다면 이것을 사용하지 마십시오.
Application.Current.Dispatcher
이것은 유일한 Application 인스턴스를 회전시키는 스레드이기 때문에 항상 UI 스레드의 디스패처를 제공합니다.
답변
내 직감에 따르면 Application.Current.Dispatcher는 변경되지 않고 현재 응용 프로그램의 모든 스레드에 전역 적이며 Dispatcher.CurrentDispatcher는 호출 된 스레드에 따라 Dispatcher의 새 인스턴스를 만들 수 있습니다.
맞습니다 Application.Current.Dispatcher
.은 현재 스레드의 디스패처가되도록 구성시 할당되는 응용 프로그램의 인스턴스 속성입니다. 그리고의 문서가 Dispatcher.CurrentDispatcher
지적했듯이 :
현재 실행중인 스레드의 Dispatcher를 가져오고 스레드와 아직 연결되지 않은 경우 새 Dispatcher를 만듭니다.
그렇다면 Dispatcher.CurrentDispatcher의 목적은 주로 다중 스레드 UI 용입니까?
아마도 작업을 디스패치하려는 UI 요소가 일반적으로 없기 때문에 백그라운드 스레드의 디스패처를 얻는 데 사용되지 않았습니다.