반응형

C#에서, Form에 구현된 컨트롤을 Form이 아닌 다른 클래스에서 호출하려 하면,

다음과 같은 에러가 발생한다.

크로스 스레드 작업이 잘못되었습니다. 'xxxx' 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다.


C#에서 UI 컨트롤들은, 자신이 만들어진 쓰레드에서만 엑세스될 수 있게 되어 있다.

하지만, 종종 다른 쓰레드에서 엑세스 해야 하는 경우가 있기 마련이다.

이런 경우에는, 컨트롤의 InvokeRequired 속성을 이용하여 

대리자 호출을 해야 되는 상황인지를 판단하여

직접호출을 하거나 대리자 호출을 하면 된다.

이에 대한 설명은, 다음 사이트에 잘 나와 있다.


다음은, 실제 사용 샘플이다.

delegate void deleg_log(object content, params object[] args);

public void log(object content, params object[] args)
{
    if (InvokeRequired)
    {
        deleg_log call = new deleg_log(log);
        Invoke(call, content, args);
    } else {            
        if (txtResult.Text.Length > 2000)
            txtResult.Text = String.Format(content.ToString(), args) + 
                                  txtResult.Text.Substring(0, 2000);
        else
            txtResult.Text = String.Format(content.ToString(), args) + txtResult.Text;
    }
}


반응형

+ Recent posts