간만에 WPF를 하는데.....
버튼으로 테스트해보니 프로그램이 잘 돌아가서 타이머를 하나 만들어서 주기적으로 실행하려고 돌렸는데...
에러가 퐝~
[WPF] 'Dispatcher.Invoke'와 'Dispatcher.BeginInvoke'
[WPF] 다른 스레드에서 UI쓰레드 접근하기 - Dispatcher.Invoke
많은 UI 구성 요소에서 호출 스레드가 필요하므로 해당 스레드는 STA여야 합니다.
혹은
"다른 스레드가 소유하고 있는 오브젝트에 현재 스레드가 접근할 수 없다"
(The calling thread cannot access this object because a different thread owns it.)
이런 식의 오류가 나기도 합니다.
하도 오랜만에 WPF를 해서 감이 없네요;;
WPF나 실버라이트에서 타이머는 다른 스레드기 때문에 UI스레드를 접근할 때 에러가 납니다.
이럴 때는 윈폼과 마찬가지로 인보크를 사용하여 작업해야 합니다.
(참고 : MSDN - Dispatcher.Invoke 메서드)
간단하게 인보크를 사용할 수 있습니다.
Dispatcher.Invoke(DispatcherPriority.Normal
, new Action(
delegate
{
//사용할 메서드 및 동작
ScrollGraph_001.AddStep(LastData);
}));
참 쉽죠?
'Dispatcher.CheckAccess()'를 통해 자신의 쓰래드 여부를 확인할 수 있습니다.
('WinForm'에서의 'InvokeRequired'와 같은 기능입니다.)
if (true == Dispatcher.CheckAccess())
{//내 쓰래드다.
}
else
{//내 쓰래드가 아니다.
}
WPF 뿐만 아니라 C#도 UI는 다른 스래드에서 동작합니다.
신경 안 쓰면 가끔 까먹는 내용이죠 ㅎㅎㅎ