|
|
|
|
|
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(Non-Blocking)를 호출하여 컨트롤을 업데이트 하면된다.
|
|
|
|
|
|
```csharp
|
|
|
Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => {
|
|
|
DoSomething();
|
|
|
}));
|
|
|
|
|
|
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new Action(() =>
|
|
|
{
|
|
|
DoSomething();
|
|
|
}));
|
|
|
```
|
|
|
|
|
|
|
|
|
|