C#子線(xiàn)程更新UI控件的方法實(shí)例總結(jié)
本文實(shí)例總結(jié)了C#子線(xiàn)程更新UI控件的方法,對(duì)于桌面應(yīng)用程序設(shè)計(jì)的UI界面控制來(lái)說(shuō)非常有實(shí)用價(jià)值。分享給大家供大家參考之用。具體分析如下:
一般在winform C/S程序中經(jīng)常會(huì)在子線(xiàn)程中更新控件的情況,桌面程序UI線(xiàn)程是主線(xiàn)程,當(dāng)試圖從子線(xiàn)程直接修改控件屬性時(shí)會(huì)出現(xiàn)“從不是創(chuàng)建控件的線(xiàn)程訪(fǎng)問(wèn)它”的異常提示。
跨線(xiàn)程更新UI控件的常用方法有兩種:
1.使用控件自身的invoke/BeginInvoke方法
2.使用SynchronizationContext的Post/Send方法更新
具體實(shí)現(xiàn)如下:
1.使用控件自身的invoke/BeginInvoke方法
Control類(lèi)實(shí)現(xiàn)了ISynchronizeInvoke 接口,我們看該接口的定義:

Control類(lèi)的invoke方法有兩個(gè)實(shí)現(xiàn)
Object Invoke(Delegate); //在擁有此控件的基礎(chǔ)窗口句柄的線(xiàn)程上執(zhí)行指定的委托
Object Invoke(Delegate,Object[] );
可以看出繼承Control類(lèi)的UI控件都可以使用Invoke方法異步更新。以下代碼段實(shí)現(xiàn)在子線(xiàn)程中更新Label控件的Text屬性
private void button6_Click(object sender, EventArgs e)
{
Thread demoThread =new Thread(new ThreadStart(threadMethod));
demoThread.IsBackground = true;
demoThread.Start();//啟動(dòng)線(xiàn)程
}
void threadMethod()
{
Action<String> AsyncUIDelegate=delegate(string n){label1.Text=n;};/<span style="font-family: Arial, Helvetica, sans-serif;">/定義一個(gè)委托</span>
label1.Invoke(AsyncUIDelegate,new object[]{"修改后的label1文本"});
}
2.使用SynchronizationContext的Post/Send方法更新
SynchronizationContext類(lèi)在System.Threading命令空間下,可提供不帶同步的自由線(xiàn)程上下文,其中Post方法簽名如下:
public virtual void Post(SendOrPostCallback d,Object state) //將異步消息調(diào)度到一個(gè)同步上下文
可以看出我們要異步更新UI控件,第一是要獲取UI線(xiàn)程的上下文了,第二就是調(diào)用post方法了,代碼實(shí)現(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();//啟動(dòng)線(xiàn)程
}
//窗體構(gòu)造函數(shù)
public Form1()
{
InitializeComponent();
//獲取UI線(xiàn)程同步上下文
_syncContext = SynchronizationContext.Current;
}
private void threadMethod()
{
_syncContext.Post(SetLabelText, "修改后的文本");//子線(xiàn)程中通過(guò)UI線(xiàn)程上下文更新UI
}
private void SetLabelText(object text)
{
this.lable1.Text = text.ToString();
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助
相關(guān)文章
C#使用分部類(lèi)設(shè)計(jì)實(shí)現(xiàn)一個(gè)計(jì)算器
分部類(lèi)是C#4.5中的一個(gè)新特性,它的出現(xiàn)使得程序的結(jié)構(gòu)更加合理,代碼組織更加緊密,本文將使用分部類(lèi)設(shè)計(jì)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器,感興趣的小伙伴可以了解下2024-02-02
C#實(shí)現(xiàn)用戶(hù)自定義控件中嵌入自己的圖標(biāo)
這篇文章主要介紹了C#實(shí)現(xiàn)用戶(hù)自定義控件中嵌入自己的圖標(biāo),較為詳細(xì)的分析了C#實(shí)現(xiàn)自定義控件中嵌入圖標(biāo)的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03
C#實(shí)現(xiàn)ComboBox變色的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)ComboBox變色的效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01
WinForm實(shí)現(xiàn)最小化到系統(tǒng)托盤(pán)方法實(shí)例詳解
這篇文章主要介紹了WinForm實(shí)現(xiàn)最小化到系統(tǒng)托盤(pán)方法,實(shí)例分析了C#中實(shí)現(xiàn)WinForm最小化到系統(tǒng)托盤(pán)所需的相關(guān)控件與使用技巧,需要的朋友可以參考下2015-05-05
使用C#實(shí)現(xiàn)一個(gè)簡(jiǎn)單的繪圖工具
這篇文章主要為大家詳細(xì)介紹了如何使用C#開(kāi)發(fā)的簡(jiǎn)單繪圖工具,可以將簽名簡(jiǎn)單繪圖后的效果以圖片的形式導(dǎo)出,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
解析C# Console 控制臺(tái)為什么也會(huì)卡死(原因分析)
在分析旅程中,總會(huì)有幾例控制臺(tái)的意外卡死導(dǎo)致的生產(chǎn)事故,有經(jīng)驗(yàn)的朋友都知道,控制臺(tái)卡死一般是動(dòng)了快速編輯窗口的緣故,雖然知道緣由,但一直沒(méi)有時(shí)間探究底層原理,市面上也沒(méi)有對(duì)這塊的底層原理介紹,昨天花了點(diǎn)時(shí)間簡(jiǎn)單探究了下,感興趣的朋友一起看看吧2023-10-10

