2013. 5. 8. 18:10

간만에 WPF를 하는데.....

버튼으로 테스트해보니 프로그램이 잘 돌아가서 타이머를 하나 만들어서 주기적으로 실행하려고 돌렸는데...

에러가 퐝~

 

[WPF] 'Dispatcher.Invoke'와 'Dispatcher.BeginInvoke'
[WPF] 다른 스레드에서 UI쓰레드 접근하기 - Dispatcher.Invoke

 

 

 

1. 원인

 

많은 UI 구성 요소에서 호출 스레드가 필요하므로 해당 스레드는 STA여야 합니다.

 

혹은

"다른 스레드가 소유하고 있는 오브젝트에 현재 스레드가 접근할 수 없다"

(The calling thread cannot access this object because a different thread owns it.)

이런 식의 오류가 나기도 합니다.

 

하도 오랜만에 WPF를 해서 감이 없네요;;

WPF나 실버라이트에서 타이머는 다른 스레드기 때문에 UI스레드를 접근할 때 에러가 납니다.

 

 

 

2. 해결 방법

 

이럴 때는 윈폼과 마찬가지로 인보크를 사용하여 작업해야 합니다.

(참고 : MSDN - Dispatcher.Invoke 메서드)

 

 간단하게 인보크를 사용할 수 있습니다.

 

Dispatcher.Invoke(DispatcherPriority.Normal
    , new Action(
        delegate 
        {      
            //사용할 메서드 및 동작
            ScrollGraph_001.AddStep(LastData); 	
        }));

참 쉽죠?

 

 

3. 자신의 쓰레드인지 확인

'Dispatcher.CheckAccess()'를 통해 자신의 쓰래드 여부를 확인할 수 있습니다.

('WinForm'에서의 'InvokeRequired'와 같은 기능입니다.)

if (true == Dispatcher.CheckAccess())
{//내 쓰래드다.
}
else
{//내 쓰래드가 아니다.
}

 

 

마무리

 

WPF 뿐만 아니라 C#도 UI는 다른 스래드에서 동작합니다.

신경 안 쓰면 가끔 까먹는 내용이죠 ㅎㅎㅎ

핫 포스팅