成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WPF Dispatcher在界面操作中作用體現

開發 開發工具
WPF Dispatcher作為一個在界面操作和更新時被UI線程關聯的唯一對象,起了一個非常重要的作用。他可以幫助我們實現按序排列的工作項隊列。

對于一個開發人員來說,可能在開發一個程序的時候對圖形界面的要求并不是很高,因為他們不是美工。那么,使用了WPF后,開發人員可以輕松的實現精美的圖形界面。#t#

使用一個專用的 UI 線程來完成界面的操作和更新,這個線程會關聯一個***的WPF Dispatcher 對象,用于調度按優先順序排列的工作項隊列。Application.Run() 實際上就是對 Dispatcher.Run() 的間接調用。

WPF Dispatcher通過循環來處理工作項隊列,這個循環通常被成為 "幀 (DispatcherFrame)"。Dispatcher.Run() 創建并啟動這個幀,這也是 Application.Run() 啟動消息循環的最終途徑。

 

  1. public sealed class Dispatcher  
  2. {  
  3. [SecurityCritical, 
    UIPermission(SecurityAction.
    LinkDemand, 
    Unrestricted=true)]  
  4. public static void Run()  
  5. {  
  6. PushFrame(new DispatcherFrame());  
  7. }  

 

DispatcherFrame 可以嵌套,并通過檢查 Continue 屬性來決定循環是否繼續。我們可以通過調用 Dispatcher.ExitAllFrames() 來終止所有的幀循環,當然這種編程方式并不可取,可能會造成一些意外出現。

與WPF Dispatcher調度對象想對應的就是 DispatcherObject,在 WPF 中絕大部分控件都繼承自 DispatcherObject,甚至包括 Application。這些繼承自 DispatcherObject 的對象具有線程關聯特征,也就意味著只有創建這些對象實例,且包含了 Dispatcher 的線程(通常指默認 UI 線程)才能直接對其進行更新操作。

當我們嘗試從一個非 UI 線程更新一個標簽,會看到一個如下的異常。

 

  1. private void button1_Click
    (object sender, RoutedEventArgs e)  
  2. {  
  3. new Thread(() => this.label1.
    Content
     = DateTime.Now.
    ToString()).Start();  

 

 

按照 DispatcherObject 的限制原則,我們改用 Window.Dispatcher.Invoke() 即可順利完成這個更新操作。

 

  1. private void button1_Click
    (object sender, Routed
    EventArgs e)  
  2. {  
  3. new Thread(() => 
  4. {  
  5. this.Dispatcher.Invoke
    (DispatcherPriority.Normal,  
  6. new Action(() => this.
    label1.Content
     = DateTime.
    Now.ToString()));  
  7. }).Start();  

 

如果在其他項目(比如類庫)中,我們可以用 Application.Current.Dispatcher.Invoke(...) 完成同樣的操作,它們都指向 UI Thread Dispatcher 這個***對象。

WPF Dispatcher還提供了 BeginInvoke 這個異步版本。

 

  1. private void button1_Click(object 
    sender, RoutedEventArgs e)  
  2. {  
  3. new Thread(() => 
  4. {  
  5. Application.Current.Dispatcher.
    BeginInvoke(DispatcherPriority.Normal,  
  6. new Action(() => 
  7. {  
  8. Thread.Sleep(3000);  
  9. this.label1.Content = 
    DateTime.Now.ToString();  
  10. }));  
  11. MessageBox.Show("Hi!");  
  12. }).Start();  

 

凡事都有例外,WPF 還提供了一種繼承自 Freezable 的類型,盡管 Freezable 也間接繼承自 DispatcherObject,但當諸如WPF Dispatcher這類對象從修改狀態變成凍結狀態時,它即變成自由線程對象,不在具有線程關聯。

責任編輯:曹凱 來源: 開發學院
相關推薦

2009-12-24 17:52:05

WPF觸發器

2009-12-29 14:58:31

WPF優點

2009-12-28 09:50:08

WPF數據綁定

2024-03-15 09:44:17

WPFDispatcherUI線程

2009-12-25 15:29:12

WPF缺陷

2009-12-25 16:40:49

WPF優勢

2009-12-04 17:31:32

PHP編碼轉換

2010-01-14 10:35:34

VB.NET指針

2010-02-02 13:15:00

C++ lambda函

2010-02-25 17:22:39

WCF服務行為

2009-08-31 16:49:23

WPF線程模型

2010-01-15 13:30:53

VB.NET Tool

2010-01-08 18:02:33

VB.NET事件

2010-01-14 13:27:33

VB.NET操作符li

2010-01-19 15:21:55

VB.NET區域性

2010-02-23 16:15:24

WCF Endpoin

2009-12-28 16:45:31

WPF窗體

2009-12-02 13:16:32

PHP DOMXPat

2010-01-20 18:34:46

VB.NET Syst

2009-12-28 17:48:01

WPF界面布局
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区三区四区 | 日韩日韩日韩日韩日韩日韩日韩 | 欧美视频一区 | 69av网 | 91精品国产麻豆 | 国产精品99久久久久久久久久久久 | 综合国产第二页 | 日韩三区在线观看 | www.久久久 | 成人在线播放网址 | 欧美精品tv | 在线视频亚洲 | 国产精品a一区二区三区网址 | 色爱av | 亚洲国产精品激情在线观看 | 国产午夜精品理论片a大结局 | 亚洲精品日韩一区二区电影 | 色综合美女| 天堂在线91 | 91porn在线 | 亚洲狠狠爱一区二区三区 | 黄视频免费 | 久久久久成人精品免费播放动漫 | 精品乱码一区二区三四区视频 | 国产在线视频三区 | 欧美日韩在线免费观看 | 久久久夜色精品亚洲 | 91精品一区二区三区久久久久 | 操操网站 | 精品久久av | 伊人春色在线观看 | 婷婷综合五月天 | 国产福利在线视频 | 国产精品永久免费 | 国产精品爱久久久久久久 | 国产69精品久久久久777 | 亚洲 欧美 日韩在线 | 精品91久久 | 亚洲一区视频在线 | 福利网址 | 国产亚洲欧美日韩精品一区二区三区 |