C# 프로그래밍을 하다 보면 크로스쓰레드라고 해서 빨간색 X박스가 나오는 경우가 있습니다.
크로스쓰레드라는 이름 그대로, Thread와 메인쓰레드가 충돌해서 나오는 현상인데,
통상적으로 쓰레드에서 UI Control에 접근하는 경우에 발생을 합니다.

< 크로스 스레드 작업이 잘못되었습니다 오류 >
그래서 이 크로스쓰레드를 피하기 위한 방법을 인터넷에 검색해보면
몇가지 방법이 나오는데, 가장 기본적인 방법이 Invoke와 MethodInvoker 를 이용한 방법이고,
아래와 같은 간단한 구문으로 처리할 수 있습니다.
this.Invoke(new MethodInvoker(delegate
{
function();//Cross Thread 발생 지점에서 사용되는 펑션들
}));
그리고 CheckForIllegalCrossThreadCalls 속성을 지정하여 피하는 방법도 있습니다.
CheckForIllegalCrossThreadCalls = false;
그런데 이 CheckForIllegalCrossThreadCalls 을 사용하는 경우는
.NetFramework 1.1 방식으로 크로스쓰레드를 피하는 방법이기 때문에
가급적이면 사용하지 않는 것이 좋다고 합니다.
사용하면 안되는 이유는 다음과 같다고 추측합니다.(정확한건 아니라는거죠)
예를 들어 Invoke를 시켰을 때는 정상적인 절차,
즉 하나의 쓰레드에서 UI에 접근을 하여 값을 변경하고, 다음 로직이 실행되어야 하는데
CheckForIllegalCrossThreadCalls 을 사용하는 경우에는
그냥 여기저기서 동시접근이 되는 형태라 의도하지 않은 결과가 나올 수 있습니다.
다시 설명하자면 Invoke 방식으로 처리하면
1~100까지 TextBox 에 순차적으로 표시를 하는데 문제가 없는데
CheckForIllegalCrossThreadCalls 속성을 사용하는 경우에는
1~100까지 순차적인 표시가 되지 않을 수 있다는 얘기입니다.
(쓰레드 동기화가 되지 않는 다는 얘기죠)
댓글