로스 스레드 작업이 잘못되었습니다. XXX 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다.'

 

자신의 스레드(Thread)의 컨트롤이 아닌 녀석을 건드리려 할 때 발생하는 에러 메시지.

즉, 스레드를 돌리면 동시 다발적으로 실행이 되므로 데이터의 무결성을 보장 하지 못하므로,

.Net에서 에러를 뱉어내는 것임.

 

 

위 현상의 해결 방법은(.Net 2.0 이상에서 가능함)

 

1. 스레드로부터 안전한 방식으로 Windows Forms 컨트롤을 호출

(http://msdn.microsoft.com/ko-kr/library/ms171728(v=vs.100).aspx)

2. BackgroundWorker를 사용하여 스레드로부터 안전한 방식으로 호출

(상동)

3. Control.CheckForIllegalCrossThreadCalls 속성 true 처리

(http://msdn.microsoft.com/ko-kr/library/system.windows.forms.control.checkforillegalcrossthreadcalls(v=vs.80).aspx)

 

-. 예제 샘플 : 방법: 백그라운드 스레드를 사용하여 파일 검색

(http://msdn.microsoft.com/ko-kr/library/3s8xdz5c(v=vs.100).aspx)

 

1,2번을 이용하여 컨트롤의 접근을 허용하도록 코딩하고,

3번은 최악의 경우에만 사용할 것(어떤 경우에서든지 모든 것을 pass 한다는 것은 위험한 행동임)

 

 

//# 아래는 Text or Label 컨트롤에 Text 값을 넣는 함수. 

delegate void Ctr_Involk (Control ctr, string text);

public void setText_Control(Control ctr, string txtValue)
{


if (ctr.InvokeRequired)
{
Ctr_Involk CI= new Ctr_Involk (setText_Control);
ctr.Invoke(CI, ctr, txtValue);
}
else
{
ctr.Text = txtValue;
}

}

 

끝.



출처 : http://blog.naver.com/hupers/70156159340

Posted by 요지
,