Please Enable JavaScript!
Gon[ Enable JavaScript ]

C# 에서 Thread Safe 의 2가지 사용법

기타 언어/C# & MFC
반응형

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.";

}


반응형
Posted by 녹두장군1
,