쓰레드 선호도 (Thread Affinity)
Programming/WinForm / 2014. 11. 3. 17:57
쓰레드 선호도 (Thread Affinity)
.NET에서 UI Application을 만들기 위해 Windows Forms(윈폼)이나 WPF (Windows Presentation Foundation)을 사용한다. 이들 WinForm이나 WPF는 그 UI 컨트롤을 생성한 쓰레드만(UI 쓰레드)이 해당 UI 객체를 엑세스할 수 있다는 쓰레드 선호도(Thread Affinity) 규칙을 지키도록 설계되었다. 만약 개발자 이러한 기본 규칙을 따르지 않는다면, 에러가 발생하거나 예기치 못한 오동작을 할 수 있다. UI 컨트롤을 생성하고 이 컨트롤의 윈도우 핸들을 소유한 쓰레드를 UI Thread라 부르고, 이러한 UI 컨트롤들을 갖지 않는 쓰레드를 작업쓰레드 (Worker Thread)라 부른다. 일반적으로 UI 프로그램은 하나의 UI Thread (주로 메인쓰레드)를 가지며, 여러 개의 작업 쓰레드를 갖는다. 하지만 필요한 경우 여러 개의 UI 쓰레드를 갖게 하는 것도 가능하다.
윈폼 UI Thread
WinForm의 UI 컨트롤들은 Control 클래스로부터 파생된 클래스들이며, Control 클래스는 UI 컨트롤이 UI 쓰레드에서 돌고 있는지를 체크하는 InvokeRequired 속성을 갖고 있으며, 만약 작업쓰레드에서 실행되고 있는 경우 Control클래스의 Invoke()나 BeginInvoke() 메소드를 사용하여 UI 쓰레드로 작업 요청을 보낸다.
예제
WPF UI Thread
WPF는 DependencyObject에 기반한 UI Element들을 사용하는데, 해당 쓰레드가 UI 컨트롤을 소유하는 쓰레드인지를 체크하는 Dispatcher.CheckAccess() 메서드가 있으며, 만약 다른 쓰레드인 경우 Dispatcher.Invoke()나 Dispatcher.BeginInvoke()를 사용하여 UI 쓰레드로 작업 요청을 보낸다.
예제
반응형
'Programming > WinForm' 카테고리의 다른 글
[펌] C# WinForm "인증서 저장소에서 매니페스트 서명 인증서를 찾을 수 없습니다." (0) | 2019.01.25 |
---|---|
Load a Cursor from a Resources in C# (0) | 2014.11.07 |
BackGroundWorker 예제 ( Thread 대용품 ) (0) | 2014.11.04 |
BackgroundWorker 클래스 (0) | 2014.11.04 |
Cursors in C# (0) | 2014.11.03 |