C# 멀티쓰레드에서 Winform 컨트롤 변경시 동기화 방법
윈폼 프로젝트를 생성하고, TextBox를 하나 추가하였고, 아래와 같은 소슬 작성하였다.
private void Form1_Load(object sender, EventArgs e) { Thread th = new Thread(test); th.Start(); } void test() { textBox1.Text = "열려라 참깨"; }
그리고 빌드를 진행하니 아래와 같이 '크로스 쓰레드' 에러가 발생하였다.
원인은 메인 쓰레드에서 객체를 가지고 있는데, 딴 넘이 와서 설정을 변경하니 발생한 에러다.
그래서 이럴 경우는 동기화를 시켜줘야한다.
아래와 같이 Invoke()나 BeginInvoke()를 메소드를 사용해서 동기화 할수 있다.
delegate void testDel(); private void Form1_Load(object sender, EventArgs e) { Thread th = new Thread(run); th.Start(); } void test() { textBox1.Text = "열려라 참깨"; } void run() { testDel td = new testDel(test); if (this.textBox1.InvokeRequired) { this.Invoke(td); } else { test(); } }
델리게이트를 선언하고 델리게이트를 Invoke 메소드의 인자로 넣었다.
왜 델리게이트로 저렇게 해줘야 하는지 궁금할 수 있는데, Invoke 메소드의 매개변수가 Delegate이기 때문이다.
또한 Control.InvokeRequired로 동기화가 필요한지 검사할 수 있다.
그러면 아래와 같이 실행된다.