|
WPF에서는 Dispatcher라고 하는 Queue에 의해서 UI가 관리된다. 기존 Native Window의 user thread가 Message 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가 한팀이다. 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 강세윤 at 12/15 오늘 많이 헤매다..알게 .. by youna at 12/14 글 잘 읽었습니다 . 전 .. by 위시 at 11/26 어렷다 by klhk at 11/09 dhjjgbem by kl at 11/09 17번부터 어떻게 접는지.. by tykim0131 at 10/28 ATL이나 MFC를 이용하.. by 김명신 at 09/24 복원되었군요.. 제 RSS.. by 강세윤 at 09/24 허걱, 하고 있는 것으로.. by 강세윤 at 09/15 RSS 주소 서비스는 안 .. by 정성태 at 09/15 이글루 파인더
| |||