티스토리 뷰

MainThread(UI Thread)가 아닌 Thread가 컨트롤로 접근시 컴파일 에러가 발생한다.

이러한 에러를 Cross Thread Error 라고 한다.

어떻게 보면 불편 하기도 하지만, 보다 안전한 코딩을 컴파일러에서 지원해준다는 점에서 좋은 것 같다.

 

간단한 툴의 경우는 보통 단일 Thread로 사용이 가능 하나, 약간의 기능을 더 넣고자 한다면 필수적으로 추가 Thread가 필요할 것 이다.

(자주 쓰이는 예로, 개별 Thread에서 일련의 작업과정을 textBox에 로그로 기록하는 상황이 있다.)

 

1. delegate를 선언하여 사용하는 방법

        private delegate void delegate_WritetLog(Control ctr, String log);

        private void WritetLog(Control ctr, string log)
        {
            if (ctr.InvokeRequired)
            {
                ctr.Invoke(new delegate_WritetLog(WritetLog), new object[] { ctr, log });
            }
            else
            {
                ctr.Text += log;
            }
        }

        // 실제 사용 예제
        WritetLog(textBox1, "로그 기록 시작");

 

2. MethodInvoker를 이용하는 방법

        private void WritetLog(Control ctr, string log)
        {
            if (ctr.InvokeRequired)
            {
                ctr.Invoke((MethodInvoker) delegate() { WritetLog(control, log); });
            }
            else
            {
                ctr.Text += log;
            }
        }

        // 실제 사용 예제
        WritetLog(textBox1, "로그 기록 시작");
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday