출처 : http://pillblog.tistory.com/entry/CrossThread
간혹 쓰래드 안에서 혹은! 동적으로 만들어진 컨트롤이 다른 윈도우 컨트롤의 모양(레이아웃)을 건드리려 한다면!!
다음과 같은 에러가 발생한다.
System.UnauthorizedAccessException: Invalid cross-thread access
혹은
Cross-thread operation not valid: blah blah blah :p
그럴땐 어찌하는냐!!
Delegate를 써야한다.
윈도우 컨트롤에게 InvokeRequired라는 걸로 이렇게 물어본다.
"내가 니 몸뚱이 색깔 좀 바꿀려는데 좀 기다릴까?"
그러면 InvokeRequired가 true/false로 대답해 줄 것이다. ㅋㅋ
허나 질문에 주의하라! true면 기다리라는 것이므로 Delegate로 하나 더 날려준다.
그리고 false가 나오면 바꾸면 된다.
InvokeRequired는 바꾸려는 컨트롤의 것을 사용해야한다.
아래의 경우 패널을 바꾸기 위해 사용한 것. 그러므로 InvokeRequired는 패널에게 물어본다.
코드는 아래와 같다.
private Command PopupInvoke(Popup popup, ScreenPanel pnl)
{
if (pnl.InvokeRequired)
{
InvokeDelegate<Popup, ScreenPanel> id = new InvokeDelegate<Popup, ScreenPanel>(PopupInvoke);
pnl.Invoke(id, new object[]{popup, pnl});
}
else
{
popup.Size = pnl.Size;
pnl.Location = new Point(0, 0);
pnl.Parent = popup.pnlPopup;
popup.ShowDialog();
}
return null;
'강좌 > C#' 카테고리의 다른 글
람다식(Lambda Expression) (0) | 2012.01.17 |
---|---|
매소드를 인수로 넘기기.. (0) | 2012.01.17 |
InvokeRequired & Cross Thread 처리방법 (0) | 2012.01.17 |
인터페이스를 상속한 자신을 파라미터로 호출한 경우. (0) | 2012.01.17 |
Interface 변수 상속한 하위 클래스 함수 호출. (0) | 2012.01.17 |