윈폼 프로젝트를 생성하고, 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로 동기화가 필요한지 검사할 수 있다.
그러면 아래와 같이 실행된다.
'개 발코딩' 카테고리의 다른 글
c# 하위 디렉토리 포함하여 파일 검색하기 (0) | 2017.07.17 |
---|---|
[c#] 메소드 내에 return을 쓰는 경우 유의사항 (0) | 2017.05.23 |
[c#] 폼안에 컨트롤 가운데 정렬 (0) | 2017.05.22 |
[c#] 웹 구축시 Log4net 설정하기 (0) | 2017.05.18 |
[c#] 파일 내의 특정 줄 읽어오기 (0) | 2017.05.18 |