Development Tip

C# - System.InvalidOperationException 크로스 스레드 작업이 잘못되었습니다

MoonLight314 2024. 3. 27. 08:34
728x90

안녕하세요, MoonLight입니다.

C#에서 평소처럼 Control에 접근해서 이런저런 작업을 하려고 하는데, 아래와 같은 Error를 만나는 경우가 있습니다.

비교적 설명이 자세히 나와 있는데요, Control이 만들어진 Thread가 아닌, 다른 Thread에서 해당 Control에 Access하려고 하는 경우에

이런 Error가 발생합니다.

저 같은 경우엔 UI를 만든 Main Thread가 아닌, 작업 Thread에서 Main Thread UI를 변경하고자 할 때 이런 Error를 만났습니다.

해결 방법은 Simple합니다. delegate를 사용하면 됩니다.

delegate는 주로 Windows Forms Application에서 사용되는데, UI를 다루는 과정에서 발생할 수 있는 Thread 간 통신 문제를 해결하기 위해 이용됩니다.

Windows Forms은 Single Threaded Apartment(STA) Model을 사용하기 때문에, UI Control은 오직 그것들이 생성된 Thread(보통 Main UI Thread)에서만 안전하게 접근할 수 있습니다.

따라서, 다른 Thread에서 UI Control을 Update하려면 Invoke Method를 사용하여 해당 작업을 UI Thread에 접근해야 합니다.

사용 문법은 아래와 같습니다.

this.Invoke((MethodInvoker)delegate {
    // 이 부분에 UI Control을 Update하는 Code를 넣습니다.
    // 예를 들어, 진행 상태를 나타내는 ProgressBar의 값을 Update하는 코드 등이 여기에 들어갈 수 있습니다.
    progressBar.Value = 50;
});

 

 

아무래도 Main UI Thread에서만 작업하는 경우는 매우 드물기 때문에 이 내용을 알고 있으면 매우 유용할 거라는 생각이 드네요.

도움이 되셨으면 좋겠습니다. 다음에 또 만나요~!

728x90