C# Winform | cross thread - InvalidOperationException
cross thread의 원인
WinForm은 그 UI 컨트롤을 생성한 쓰레드만(UI 쓰레드)이 해당 UI 객체를 엑세스할 수 있다는 쓰레드 선호도(Thread Affinity) 규칙을 지키도록 설계되었다.
만약 개발자가 이러한 기본 규칙을 따르지 않는다면, 에러가 발생하거나 예기치 못한 오동작을 할 수 있다.
UI 컨트롤을 생성하고 이 컨트롤의 윈도우 핸들을 소유한 쓰레드를 UI Thread라 부르고,
이러한 UI 컨트롤들을 갖지 않는 쓰레드를 작업쓰레드 (Worker Thread)라 부른다.
일반적으로 UI 프로그램은 하나의 UI Thread (주로 메인쓰레드)를 가지며, 여러 개의 작업 쓰레드를 갖는다.
해결방법
Control.Invoke 메서드
컨트롤의 내부 창 핸들이 있는 스레드에서 대리자를 실행합니다.
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 |
'C# Winform' 카테고리의 다른 글
C# Winform | Hardware Info | CPU ID, HDD, Mac, Serial (0) | 2020.04.29 |
---|---|
C# Winform | DateTime Convert(Long To, TimeStamp to) (0) | 2020.04.28 |
C# Winform | properties settings 저장 (0) | 2020.03.05 |
C# Winform | Notification Popup (0) | 2020.02.28 |
C# Winform | Watermark in a textbox | Placeholder (0) | 2020.02.27 |