c# 윈도우 프로그래밍에서 DataGridView를 윈도우 위에 올려 놓고.
메인 스레드에서 새로운 쓰레드=t1 생성 후에
t1에서 그리드 뷰를 연신 Clear 했더니......
간헐적으로 에러가 나는게 아니겠습니까..
그래서 Debug 모드로 실행을 시켰더니..
친절하게
방법: 스레드로부터 안전한 방식으로 Windows Forms 컨트롤 호출
이런 도움말을 뽑아 주더라구욤.
에러가 발생한 원인은
.NET Framework에서는 사용자가 스레드로부터 안전하지 않은 방식으로 컨트롤에 액세스할 경우 이를 감지할 수 있습니다. 디버거에서 응용 프로그램을 실행할 때 컨트롤을 만든 스레드가 아닌 스레드에서 해당 컨트롤을 호출하려고 하면 디버거에서 InvalidOperationException을 발생시키고 "컨트롤 이름 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다."라는 메시지를 표시합니다.
-> 아래와 같은 상황도 첨부되어 있습니다. 그러니까 프레임워크 2.0 이하 버전에서는 이런 예외가 발생하지 수 있다는 말이군요.
이 예외는 일부 환경에서 런타임에 디버깅하는 동안 안정적으로 발생합니다. 이 예외가 발생할 경우 문제를 수정하는 것이 좋습니다. 이 예외는 .NET Framework 2.0 이전 버전에서 작성한 응용 프로그램을 디버깅할 때 발생할 수 있습니다.
이제 저런 문제는 어떻게 처리하는가!?!?
스레드로부터 안전한 방식으로 Windows Forms 컨트롤 호출
스레드로부터 안전한 방식으로 Windows Forms 컨트롤을 호출하려면
1.컨트롤의 InvokeRequired 속성을 쿼리합니다.
2. InvokeRequired가 true를 반환하는 경우에는 컨트롤을 실제로 호출하는 대리자를 사용하여 Invoke를 호출합니다.
3. InvokeRequired가 false를 반환하는 경우에는 컨트롤을 직접 호출합니다.
좀 더 자세한 정보는
http://msdn2.microsoft.com/ko-kr/library/ms171728.aspx
EX DataGridView Clear ,add 예제 )
delegate void DelegateThreadClaer();
private void GridViewClear()
{
this.BoardGridView.Rows.Clear();
}
delegate void DelegateThreadAdd(string [] row);
private void GridViewAdd(string[] row)
{
this.BoardGridView.Rows.Add(row);
}
if (this.BoardGridView.InvokeRequired)
{
DelegateThreadClaer del = GridViewClear;
this.BoardGridView.Invoke(del);
}
else
{
BoardGridView.Rows.Clear();
}
if (this.BoardGridView.InvokeRequired)
{
DelegateThreadAdd add = GridViewAdd;
this.Invoke(add,new object[]{row});
}
else
{
BoardGridView.Rows.Add(row);
}

이올린에 북마크하기
이올린에 추천하기
