最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#子線程更新UI控件的方法實例總結(jié)

 更新時間:2014年09月15日 11:27:50   投稿:shichen2014  
這篇文章主要介紹了C#子線程更新UI控件的方法,在桌面應用程序中控制UI界面有著不錯的實用價值,需要的朋友可以參考下

本文實例總結(jié)了C#子線程更新UI控件的方法,對于桌面應用程序設計的UI界面控制來說非常有實用價值。分享給大家供大家參考之用。具體分析如下:

一般在winform C/S程序中經(jīng)常會在子線程中更新控件的情況,桌面程序UI線程是主線程,當試圖從子線程直接修改控件屬性時會出現(xiàn)“從不是創(chuàng)建控件的線程訪問它”的異常提示。

跨線程更新UI控件的常用方法有兩種:

1.使用控件自身的invoke/BeginInvoke方法

2.使用SynchronizationContext的Post/Send方法更新

具體實現(xiàn)如下:

1.使用控件自身的invoke/BeginInvoke方法

Control類實現(xiàn)了ISynchronizeInvoke 接口,我們看該接口的定義:

Control類的invoke方法有兩個實現(xiàn)

Object Invoke(Delegate); //在擁有此控件的基礎窗口句柄的線程上執(zhí)行指定的委托

Object Invoke(Delegate,Object[] );

可以看出繼承Control類的UI控件都可以使用Invoke方法異步更新。以下代碼段實現(xiàn)在子線程中更新Label控件的Text屬性

private void button6_Click(object sender, EventArgs e) 
{ 
   Thread demoThread =new Thread(new ThreadStart(threadMethod)); 
   demoThread.IsBackground = true; 
   demoThread.Start();//啟動線程 
} 
 
 void threadMethod() 
 {  
   Action<String> AsyncUIDelegate=delegate(string n){label1.Text=n;};/<span style="font-family: Arial, Helvetica, sans-serif;">/定義一個委托</span> 
   label1.Invoke(AsyncUIDelegate,new object[]{"修改后的label1文本"}); 
 } 

2.使用SynchronizationContext的Post/Send方法更新

SynchronizationContext類在System.Threading命令空間下,可提供不帶同步的自由線程上下文,其中Post方法簽名如下:

public virtual void Post(SendOrPostCallback d,Object state)    //將異步消息調(diào)度到一個同步上下文

可以看出我們要異步更新UI控件,第一是要獲取UI線程的上下文了,第二就是調(diào)用post方法了,代碼實現(xiàn):

SynchronizationContext _syncContext = null; 
 
private void button6_Click(object sender, EventArgs e) 
{ 
  Thread demoThread =new Thread(new ThreadStart(threadMethod)); 
  demoThread.IsBackground = true; 
  demoThread.Start();//啟動線程 
} 
 
//窗體構(gòu)造函數(shù)   
public Form1() 
{ 
  InitializeComponent(); 
   //獲取UI線程同步上下文 
  _syncContext = SynchronizationContext.Current; 
} 
 
private void threadMethod() 
{ 
   _syncContext.Post(SetLabelText, "修改后的文本");//子線程中通過UI線程上下文更新UI 
} 
  
private void SetLabelText(object text) 
{ 
  this.lable1.Text = text.ToString(); 
}

希望本文所述對大家的C#程序設計有所幫助

相關文章

  • C#幾種排序算法

    C#幾種排序算法

    C#幾種排序算法...
    2007-03-03
  • C#如何實現(xiàn)用戶名與密碼登錄

    C#如何實現(xiàn)用戶名與密碼登錄

    這篇文章主要介紹了C#如何實現(xiàn)用戶名與密碼登錄問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • C#使用分部類設計實現(xiàn)一個計算器

    C#使用分部類設計實現(xiàn)一個計算器

    分部類是C#4.5中的一個新特性,它的出現(xiàn)使得程序的結(jié)構(gòu)更加合理,代碼組織更加緊密,本文將使用分部類設計實現(xiàn)一個簡單的計算器,感興趣的小伙伴可以了解下
    2024-02-02
  • C#實現(xiàn)用戶自定義控件中嵌入自己的圖標

    C#實現(xiàn)用戶自定義控件中嵌入自己的圖標

    這篇文章主要介紹了C#實現(xiàn)用戶自定義控件中嵌入自己的圖標,較為詳細的分析了C#實現(xiàn)自定義控件中嵌入圖標的具體步驟與相關實現(xiàn)技巧,需要的朋友可以參考下
    2016-03-03
  • C#全角半角轉(zhuǎn)換函數(shù)代碼分享

    C#全角半角轉(zhuǎn)換函數(shù)代碼分享

    這篇文章介紹了C#全角半角轉(zhuǎn)換函數(shù)代碼,有需要的朋友可以參考一下
    2013-09-09
  • C#實現(xiàn)ComboBox變色的示例代碼

    C#實現(xiàn)ComboBox變色的示例代碼

    這篇文章主要為大家詳細介紹了C#如何實現(xiàn)ComboBox變色的效果,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • WinForm實現(xiàn)最小化到系統(tǒng)托盤方法實例詳解

    WinForm實現(xiàn)最小化到系統(tǒng)托盤方法實例詳解

    這篇文章主要介紹了WinForm實現(xiàn)最小化到系統(tǒng)托盤方法,實例分析了C#中實現(xiàn)WinForm最小化到系統(tǒng)托盤所需的相關控件與使用技巧,需要的朋友可以參考下
    2015-05-05
  • 使用C#實現(xiàn)一個簡單的繪圖工具

    使用C#實現(xiàn)一個簡單的繪圖工具

    這篇文章主要為大家詳細介紹了如何使用C#開發(fā)的簡單繪圖工具,可以將簽名簡單繪圖后的效果以圖片的形式導出,有需要的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • unity實現(xiàn)簡單的貪吃蛇游戲

    unity實現(xiàn)簡單的貪吃蛇游戲

    這篇文章主要為大家詳細介紹了unity實現(xiàn)簡單的貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 解析C# Console 控制臺為什么也會卡死(原因分析)

    解析C# Console 控制臺為什么也會卡死(原因分析)

    在分析旅程中,總會有幾例控制臺的意外卡死導致的生產(chǎn)事故,有經(jīng)驗的朋友都知道,控制臺卡死一般是動了快速編輯窗口的緣故,雖然知道緣由,但一直沒有時間探究底層原理,市面上也沒有對這塊的底層原理介紹,昨天花了點時間簡單探究了下,感興趣的朋友一起看看吧
    2023-10-10

最新評論

宁城县| 资溪县| 封丘县| 吉隆县| 金山区| 鄂伦春自治旗| 名山县| 霍州市| 晋中市| 淄博市| 道孚县| 合作市| 遂昌县| 沭阳县| 兰溪市| 梁山县| 林州市| 涡阳县| 双辽市| 浮山县| 邯郸市| 大厂| 盖州市| 贺兰县| 白玉县| 广水市| 苏州市| 海兴县| 丽江市| 鄂州市| 翁牛特旗| 马鞍山市| 西乌珠穆沁旗| 合江县| 彭泽县| 镶黄旗| 长寿区| 建德市| 灵台县| 开远市| 清水河县|