멀티 스레딩 환경에서 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 업데이트를 쉽게 수행할 수 있습니다.
'Language > C# WPF' 카테고리의 다른 글
[WPF] shape 이미지 관련 - Ellipse, Rectangle background image(BitmapImage to ImageBrush) (0) | 2019.08.26 |
---|---|
OpenCV Sharp Dll error 발생 시 해결방법 (0) | 2015.01.10 |
[C#] ConfigurationManager.AppSettings 사용하기 (0) | 2014.11.10 |
[C#] OS에 따른 Form크기의 자동 배율 조정 (0) | 2014.09.04 |
[C#] CultureInfo 이름찾아보기 (0) | 2014.07.06 |