본문 바로가기

C# Winform

C# Winform | cross thread - InvalidOperationException

by C기억저장소 2020. 3. 2.

C# Winform | cross thread - InvalidOperationException

 

  cross thread의 원인

WinForm은 그 UI 컨트롤을 생성한 쓰레드만(UI 쓰레드)이 해당 UI 객체를 엑세스할 수 있다는 쓰레드 선호도(Thread Affinity) 규칙을 지키도록 설계되었다. 
만약 개발자가 이러한 기본 규칙을 따르지 않는다면, 에러가 발생하거나 예기치 못한 오동작을 할 수 있다. 
UI 컨트롤을 생성하고 이 컨트롤의 윈도우 핸들을 소유한 쓰레드를 UI Thread라 부르고, 
이러한 UI 컨트롤들을 갖지 않는 쓰레드를 작업쓰레드 (Worker Thread)라 부른다. 
일반적으로 UI 프로그램은 하나의 UI Thread (주로 메인쓰레드)를 가지며, 여러 개의 작업 쓰레드를 갖는다.

 

  해결방법

 

Control.Invoke 메서드
컨트롤의 내부 창 핸들이 있는 스레드에서 대리자를 실행합니다.

MSDN 참고

 

Control.Invoke 메서드 (System.Windows.Forms)

컨트롤의 내부 창 핸들이 있는 스레드에서 대리자를 실행합니다.Executes a delegate on the thread that owns the control's underlying window handle.

docs.microsoft.com

 

  사용방법

 

다음의 this는 Form객체 또는 해당 UI Control객체를 뜻한다.

 

1. 동기화 delegate

 

this.Invoke((System.Action)(() =>
{
  //UI 컨트롤         
}));
cs
 
 

 

2. 비동기 delegate

 

this.BeginInvoke((System.Action)(() =>
{
   //UI 컨트롤
}));
 
cs