로스 스레드 작업이 잘못되었습니다. 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/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
'C#' 카테고리의 다른 글
[C#] 버전 정보 및 컴파일(Build) 날짜 정보 구하기 (0) | 2013.02.05 |
---|---|
[C#] 숫자만 추출 (0) | 2013.02.02 |
[C#] 단축키 구현 (0) | 2013.01.11 |
[C#] ScreenLog 스크린 로그 (.TXT) (0) | 2012.12.07 |
[C#] Debug.WriteLine / Debug 경고창 띄우기! (0) | 2012.12.03 |