Language/C# WPF

[C#] 크로스 스레드 작업이 잘못되었습니다. 일때는 delegate, Involk를 사용하자.

멱군 2014. 11. 20. 20:14

멀티 스레딩 환경에서 UI 요소에 액세스하려고 할 때 "크로스 스레드 작업이 잘못되었습니다"와 같은 오류 메시지에 직면하기 쉽습니다. 이는 UI 요소는 그것을 생성한 스레드에서만 접근해야 하는데 다른 스레드에서 접근하려고 할 때 발생합니다. 이 문제를 해결하기 위한 방법 중 하나는 `delegate`와 `Invoke`를 사용하는 것입니다. 이 글에서는 이러한 오류를 해결하는 방법을 살펴보겠습니다.

 

 

1. 메인폼 종료하기

메인폼을 종료하려면 다음과 같이 delegate를 선언합니다.

delegate void SetFormCloseCallback();

다음의 함수를 작성하여 메인폼을 안전하게 종료할 수 있습니다.

private void SetClose()
{
    if (this.InvokeRequired)
    {
        SetFormCloseCallback d = new SetFormCloseCallback(SetClose);
        this.Invoke(d, new object[] { });
    }
    else
    {
        this.Close();
    }
}

 

2. TextBox 값 변경하기

텍스트박스의 값을 변경하려면, 다음과 같이 delegate를 선언합니다.

delegate void SetTextCallback(string text);

다음의 함수를 작성하여 TextBox의 값을 안전하게 변경할 수 있습니다.

private void SetText(string text)
{
    if (this.InvokeRequired)
    {
        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.textBox1.Text = text;
    }
}

 

3. 다른 컨트롤에 적용하기

위의 방법은 TextBox 외의 다른 컨트롤에도 적용됩니다. 오류를 해결하려면 해당 컨트롤에 맞는 delegate를 선언하고 값을 안전하게 변경하는 함수를 작성하면 됩니다.

 

결론

멀티 스레딩 환경에서 UI 요소에 접근할 때 발생하는 크로스 스레드 작업 오류는 `delegate`와 `Invoke`를 사용하여 간단하게 해결할 수 있습니다. 이 방법을 사용하면 스레드 간 안전한 UI 업데이트를 쉽게 수행할 수 있습니다.