Dispatcher
WPF 응용 프로그램은 STA (Single Thread Apartment) 모델을 사용한다.
STA 모델은 인터페이스 전체를 하나의 스레드가 소유하는것을 의미한다.
이 모델을 사용하기 위해 WPF 응용 프로그램은 DispathcerObject의 Dispatcher를 이용하여 화면을 업데이트 한다.
WPF의 모든 컨트롤은 DispatcherObject로 부터 파생되어 자신을 소유하고 있는 스레드에서만 접근이 가능하다.
만약 다른 스레드에서 컨트롤에 접근을 시도하면 아래와 같은 런타임 오류가 발생한다.
"The calling thread cannot access this object because a different thread owns it."
UI 스레드가 아닌 스레드에서 UI 스레드로 접근하려 할 때도 아래와 같은 오류가 발생한다.
"The calling thread must be STA, because many UI components require this."
해결방법은 Dispatcher의 Invoke 또는 BeginInvoke(Asynchronize)를 호출하여 컨트롤을 업데이트 하면된다.
Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => {
DoSomething();
}));
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new Action(() =>
{
DoSomething();
}));