[WPF]Dispatcher와 UI Threading

WPF에서는 Dispatcher라고 하는 Queue에 의해서 UI가 관리된다. 기존 Native Windowuser threadMessage handler를 가지고 Message를 처리했던 것처럼 유사하게 하나의 Dispatcher queue는 하나의 UI thread에 대한 사용자 interaction 및 갖가지 Event들을 처리하게 된다.

예를 들어, UI가 존재하는 Single Threaded Application이 상당히 오랜 시간이 걸리는 연산처리와 더불어 UI update등이 필요하다면, Dispatcher queue를 통해서 해당 연산처리 역시 처리되도록 해야만 Blocking 현상과 같은 문제를 막을 수 있다. Dispatcher.BeginInvoke 함수는 Dispatcher queue에 해당 operation Queue in 하도록 하고, Dispatcher schedule에 따라 연산이 수행될 것이다.

 

public delegate void getPrimeNumberDelegate();

//. . .

//

button1.Dispatcher.BeginInvoke(

                    DispatcherPriority.Normal,

                    new getPrimeNumberDelegate(GetPrimeNumber));

// …

// GetPrimeNumber Function에서는 UIElement 대한 Blocking 없는 UI Update 가능함.

 

Ui Thread Blocking Call과의 접목이 아닌, Blocking Call Non-UI Thread(Worker Thread처럼) 처리하고 그동안에 뭔가 진행중이라는 UI Window 새로운 Thread에서 열어 처리하는 경우도 있을 모르겠다. 다음은 Thread Dispatcher 한팀이다.

  
  public delegate void CloseDelegate();
// ...          

private void button2_Click(object sender, RoutedEventArgs e)

 {

     t = new Thread(new ThreadStart(ThreadStartingPoint));

     t.SetApartmentState(ApartmentState.STA);

     t.IsBackground = true;

     t.Start();

 }

 private void ThreadStartingPoint()

 {

     p = new ProgressBarDlg();

     p.Show();

     System.Windows.Threading.Dispatcher.Run();

 }          

 private void button3_Click(object sender, RoutedEventArgs e)

 {

     p.Dispatcher.BeginInvoke(DispatcherPriority.Background , new CloseDelegate(TClose));

 }

 public void TClose()

 {

     p.Close();

 }

by 강세윤 | 2008/07/01 20:16 | 정리되지 않은 기술 | 트랙백 | 덧글(0)
트랙백 주소 : http://byung.egloos.com/tb/4459989
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >