SPATIUM Mobile
주소복사
About Operating System Languages Tools Favorites Notice Visit TEST  
     Android (3)
     Linux (1)
     MacOS (1)
     OS (1)
     Solaris10 (15)
     Windows (1)
     Windows Server (2)
     Windows XP (3)
   ID  
   Password  
  |  
  Location United States
  IP Address 3.144.122.20
2024. 11
12
3456789
10111213141516
17181920212223
24
25
2627282930
Category  Languages, WPF
Writer 김태우 Date 2013-07-30 18:15:21 Visit 7615
[WPF] Dispatcher, Invoke
 

Dispatcher

 
참고 : http://msdn.microsoft.com/ko-kr/library/ms750441.aspx
 
System.Threading.DispatcherObject 
 
WPF 발생 오류 : 
    많은 UI 구성 요소에서 호출 스레드가 필요하므로 해당 스레드는 STA여야 합니다.
    다른 스레드가 소유하고 있는 오브젝트에 현재 스레드가 접근할 수 없다.
*SAT(Single Thread Apartment):단일 스레드
 
1. WPF의 대부분의 개체는 동시성 및 스레딩을 처리하기 위한 기본 구문을 제공하는 DispatcherObject에서 파생된다.
 
2. WPF는 디스패처에 의해 구현된 메시징 시스템을 기반으로 한다.
따라서 WPF에서 동시성을 논의할 때는 두 가지 핵심 개념인 디스패처와 스레드 선호도를 반드시 이해해야 한다.
 
3. 디스패처는 우선 순위가 지정된 여러 개의 큐가 있는 기본 메시지 디스패치 시스템이다. 메시지의 예로 마우스 이동, 메서드 실행 등을 들 수 있다. DispatcherObject에서 파생하여 STA(단일 스레드 선호도) 동작이 있는 CLR 개체를 만들면 생성 시 디스페처에 포인터가 지정된다.
위와 같은 이유로 UI 스레드에 의해 점유중인 자원에 대해 백그라운드에서 작업을 수행하기 위해서는 해당 UI 스레드의 Dispatcher에 작업을 위임해야만 한다. 그럴때 사용하는 것이 Invoke 메서드..
 
어려운 점은 작업 환경에서 해당 자원의 돌아가는 상태를 도무지 알 수 없다는 것이다.
따라서 Invoke가 필요한지 필요하지 않은지에 대한 판정이 필요하다.
 
 
 
이를 InvokeRequired라고 이름짓고, 다음과 같이 사용할 수 있다.
 
 
 
static bool InvokeRequired
{
    get { return Dispatcher.CurrentDispatcher != Application.Current.Dispatcher; }
}
 
usage1:
if (InvokeRequired)
    // Invoke 콜
else
    // 일반 콜
 
usag2:
Dispatcher.BeginInvoke(new Action(() => this.test()), DispatcherPriority.ContextIdle, null);
 
백그라운드 스레드를 완료하고 this.test() 메소드를 비동기 실행,가끔 UI렌더링이 완료시점이 Loaded 이벤트 보다 늦을 경우 사용
 
 
Tags  Dispatcher, Invoke, BeginInvoke
  Relation Articles
[Languages-WPF] [WPF] Dispatcher, Invoke (2013-07-30 18:15:21)
  Your Opinion
Member ID
150 letters
Copyright (C) SPATIUM. All rights reserved.
[SPATIUM]WebMaster Mail