본문으로 바로가기

C# 윈도우 프로그램에서 쓰레드를 사용하였는데 쓰레드에서 폼의 컨트롤을 사용할 경우
'크로스 스레드 작업이 잘못되었습니다. '...'컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다.'
에러가 발생한다. 


스레드로 동작할 경우 하나의 컨트롤과 또 다른 하나의 컨트롤이 동시에 같은 메모리 주소를 참조 하는 경우... 
쉽게 말해서 작업자에게 동시에 두가지 작업을 시키게 되면 작업우선순위를 결정하지 못해서 작업을 포기하거나 무엇부터 할 것인지 논의해야 하는 상황이 발생한다고 보면 된다.
스레드 동작 경우는 특정작업을 동시에 진행하므로 이러한 현상이 발생할 확률이 상당히 높다.

CrossThreadSafetyAccess.zip

C++ 의 경우는 Critical Section 등의 처리로 이런간섭을 번거롭게 처리해 주어한다.
때에 따라서는 Critical Section으로의 진입과 탈출을 정확하게 컨트롤 해야 하는 경우도 있다.

C#의 경우는 InvokeRequired를 확인하여 delegate,Invoke로 처리하는 방법이 있다.

delegate를 정의하고 
delegate void CrossThreadSafetySetText(Control ctl, String text, String text2);
실행 부분에서 
InvokeRequired를 Check하여 Invoke를 실행한다

private void CSafeSetText(Control ctl, String text, String text2) 
{						
 if ( ctl.InvokeRequired )
	ctl.Invoke(new CrossThreadSafetySetText(CSafeSetText), ctl, text, text2);
 else
  ctl.Text = text;
}

Control혹은 Form에서 Invoke를 실행하는 다른 방법

private void CSafeSetText2(String text, String text2) { if (button3.InvokeRequired) { //Argument를 생성하는 방법 Invoke(new CrossThreadSafetyFormSetText(CSafeSetText2),new object[]{text,text2}); } else button3.Text = text; }


'개발언어 > C#' 카테고리의 다른 글

Convert int to bool in C# 자료형 변환  (0) 2017.06.15
C# interface 안에서 Delegate 선언  (0) 2017.06.14
관리자 권한 상승  (0) 2017.05.24
c#Typeof로 동적 인스턴스 만들기  (0) 2017.05.19
Compiling C# Code at Runtime  (0) 2017.05.19