본문 바로가기
C#/C# Troubleshooting

컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다.

by doublerabbits 2022. 8. 12.

C# WinForm 에서 작업(Work) 스레드에서 GUI Control 을 직접 호출하거나 변경하려는 경우 에러 발생

 

 

작업 스레드에서 GUI Control 을 호출하는 경우 아래의 순서를 따른다.

1. 호출하려는 컨트롤의 InvokeRequired 속성을 쿼리한다.

2. InvokeRequired 의 결과가 true 인 경우, delegate 를 이용하여 Invoke 를 호출한다.

3. InvokeRequired 의 결과가 false 인 경우 컨트롤을 직접 호출한다.

 

Thread workThread;

private void btnWorkThreadStart_Click(object sender, EventArgs e)
{
    this.workThread = new Thread(new ThreadStart(this.SetText));
    this.workThread.Start();
}


private void _SetText()
{
    this.textBox1.Text = "Hello World !");
}

private void SetText(string text)
{
    if (this.textBox1.InvokeRequired)
    {
        this.BeginInvoke(new Action(() => _SetText(text)));
    }
    else
    {
        _SetText();
    }
}