본문 바로가기

Programming/C# Sample Code

[ Programming_C# Sample Code ] CrossThreadCall과 Invoke에 대해

C#에서 Thread 사용 시 CrossThreadCall에 대한 처리가 까다롭다...
물론 아래 같이 설정 하나로 무시할 수 있지만, 누수가 발생하는 점이 있다...

CheckForIllegalCrossThreadCalls = false;    // CrossThreadCall 관련 에러 무시


그리고 정당(?)한 방법으로 CrossThreadCall을 해결하려면, 대리자(delegate)를 이용하여야 한다. 예제를 찾아보면 변경하려는 각 컨트롤 마다 대리자와 접근 함수를 만들어 줘야해서 불만이었다...ㅜㅜ
그런데 우연히 들어간 블로그(http://redreans.tistory.com/64) 해당 내용에 대한 좋은 내용이 있지 않은가!!!
해당 내용을 이용하여, 같은 타입(TextBox, Label등)의 컨트롤을 하나의 대리자와 함수로 접근할 수 있다는 것을 알게 됐다!!!ㅜㅜ(감격)

private delegate void SetTextBoxCallback(TextBox tbTxtBox, string strMsg);

private void SetTextBox(TextBox tbTxtBox, string strMsg)
{
    if (this.tbTxtBox.InvokeRequired)
    {
        SetTextBoxCallback SetTextBoxCB = new SetTextBoxCallback(SetTextBox);
        this.Invoke(SetTextBoxCB, new object[] { tbTxtBox, strMsg });
    }
    else
    {
        tbTxtBox.Text = strMsg;
        tbTxtBox.Update();
    }
}


위의 소스를 좀 더 연구하면, 하나의 대리자와 함수로 원하는 컨트롤을 다 접근할 수 있지 않을까?ㅜㅜ