日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#子线程中更新ui

發布時間:2025/4/5 C# 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#子线程中更新ui 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

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

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

具體實現如下:

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

Control類實現了ISynchronizeInvoke 接口。

?

Control類的invoke方法有兩個實現

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

Object Invoke(Delegate,Object[] );

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

[csharp]?view plain?copy
  • 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)??? //將異步消息調度到一個同步上下文

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

    [csharp]?view plain?copy
  • SynchronizationContext?_syncContext?=?null;???
  • private?void?button6_Click(object?sender,?EventArgs?e)???
  • {???
  • ??Thread?demoThread?=new?Thread(new?ThreadStart(threadMethod));???
  • ??demoThread.IsBackground?=?true;???
  • ??demoThread.Start();//啟動線程???
  • }???
  • //窗體構造函數?????
  • 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();???
  • }
  • 原文鏈接:http://blog.csdn.net/smilefyx/article/details/47724911

    總結

    以上是生活随笔為你收集整理的C#子线程中更新ui的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。