“Winform에서 일반적으로 워커스레드에서 UI컨트롤에 접근할 때는 UI Thread역할을 수행하는 Main Thread에서 Invoke를 통해 그 부분만 SynchoronizationContext에 작업을 위임하여 처리한다.”
저는 이렇게 알고 있는데요.
VS를 통해 디버깅모드로 수행하면 InvalidOperationException을 통해 크로스스레드 오류가 발생합니다. 이 부분은 예상과 같은 부분인데, 이걸 VS를 통해서 실행하지 않고 직접 빌드된 파일을 실행하면 오류가 발생되지도 않고 정상 작동합니다.
코드는 아래와 같습니다.
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace UIElementAccessNoneInvoke
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
textBox1.Text = i.ToString();
textBox2.Text = i.ToString();
textBox3.Text = i.ToString();
await Task.Delay(500);
}
});
}
}
}
.NET 5에서 텍스트 박스 3개랑 버튼 1개 올려놓고 테스트한 것인데요. 아무런 설정도 건들지 않고 이렇게만 했습니다.
이렇게 해서 정상작동하는 작업을 신뢰할 수 있을까요?