posted by 방랑군 2012. 1. 17. 04:45

출처 :  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<PopupScreenPanel> id = new InvokeDelegate<PopupScreenPanel>(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;

        }