본문으로 바로가기

C# CrossThread Invoke 정상적인 방법과 비정상적인 방법

category IT/C# 2018.11.15 13:06


C# 프로그래밍을 하다 보면 크로스쓰레드라고 해서 빨간색 X박스가 나오는 경우가 있습니다.

크로스쓰레드라는 이름 그대로, Thread와 메인쓰레드가 충돌해서 나오는 현상인데,

통상적으로 쓰레드에서 UI Control에 접근하는 경우에 발생을 합니다.


c# 크로스쓰레드 오류 발생

< 크로스 스레드 작업이 잘못되었습니다 오류 >


그래서 이 크로스쓰레드를 피하기 위한 방법을 인터넷에 검색해보면

몇가지 방법이 나오는데, 가장 기본적인 방법이 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까지 순차적인 표시가 되지 않을 수 있다는 얘기입니다.

(쓰레드 동기화가 되지 않는 다는 얘기죠)