Window Form 의 control 들을 바로 접근할수 있으면 스레드에 안전하지
못하다. NET framework 에서는 스레드에 안전하지 않은 방식으로 접근하게 되면 막아준다.
그리고 InvalidOperationException Exception 메시지를 던져준다.
이 스레드 안전하지 못한 방식의 접근 소스는 다음의 형태와 같다.
// This event handler creates a thread that calls a
// Windows Forms control in an unsafe way.
private void setTextUnsafeBtn_Click(
object sender,
EventArgs e)
{
this.demoThread =
new Thread(new ThreadStart(this.ThreadProcUnsafe));
this.demoThread.Start();
}
// This method is executed on the worker thread and makes
// an unsafe call on the TextBox control.
private void ThreadProcUnsafe()
{
this.textBox1.Text = "This text was set unsafely.";
}
첫번째 스레드 안전한 방법은 스레드를 하나 만드는것이다.그 만든 스레드에 호출할
함수를 파라미터로 넘긴후 호출되는 함수는 사용할 컨트롤의 InvokeRequired 를 호출하여
지금 접근해도 안전한지 판단한후에 컨트롤을 제어한다.
// This event handler creates a thread that calls a
// Windows Forms control in a thread-safe way.
private void setTextSafeBtn_Click(
object sender,
EventArgs e)
{
this.demoThread =
new Thread(new ThreadStart(this.ThreadProcSafe));
this.demoThread.Start();
}
// This method is executed on the worker thread and makes
// a thread-safe call on the TextBox control.
private void ThreadProcSafe()
{
this.SetText("This text was set safely.");
}
private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
두번째 방법은 BackgroundWorker compoent 를 사용한다.컴퍼넌트에 RunWorkerAsync 라는
함수가 있는데 이것을 실행하면 컴퍼넌트명_RunWorkerCompleted 라는 이벤트 함수를 호출하게 된다
여기다 구현을 하면된다. 이것을 툴에서 설정해보자
마우스로 끌어서 폼에가져간다. 그러면 폼 화면아래에 컴퍼넌트가 생긴다
이 컴퍼넌트의 이벤트 속성에 보면 RunWorkerCompleted 가 있을것이다
이것을 클릭하게 되면 함수가 자동으로 생기니 여기에다 구현을 하면된다.
// This event handler starts the form's
// BackgroundWorker by calling RunWorkerAsync.
//
// The Text property of the TextBox control is set
// when the BackgroundWorker raises the RunWorkerCompleted
// event.
private void setTextBackgroundWorkerBtn_Click(
object sender,
EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
// This event handler sets the Text property of the TextBox
// control. It is called on the thread that created the
// TextBox control, so the call is thread-safe.
//
// BackgroundWorker is the preferred way to perform asynchronous
// operations.
private void backgroundWorker1_RunWorkerCompleted(
object sender,
RunWorkerCompletedEventArgs e)
{
this.textBox1.Text =
"This text was set safely by BackgroundWorker.";
}
'기타 언어 > C# & MFC' 카테고리의 다른 글
C# 에서 ActiveX Control 간단하게 만들어보기 (0) | 2009.04.07 |
---|---|
C# 에서의 Thread class (0) | 2009.03.21 |
DB 검색 데이타 양이 많아 메인 화면이 멈추는걸 막고 독립적인 Thread 로 돌리고 싶을때 (2) | 2009.03.21 |
List 나 Grid 등에 대량의 데이터를 업로드 할 때 화면멈춤 해결하기 (0) | 2009.03.19 |
delegate 간단하게 사용설명과 예제를 보여준다. (2) | 2009.03.18 |
Error while trying to run project : Unable to start debugging 잘못된 바인딩핸들입니다 - 에러 (0) | 2009.03.18 |
Local 컴퓨터에 있는 OLEDB Provider 를 알아오는 방법 (0) | 2009.03.17 |
ADO Connection Strings (0) | 2009.03.15 |