본문 바로가기

개 발코딩

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로 동기화가 필요한지 검사할 수 있다.

그러면 아래와 같이 실행된다.