C#子線程更新UI控件的方法實例總結(jié)
本文實例總結(jié)了C#子線程更新UI控件的方法,對于桌面應(yīng)用程序設(shè)計的UI界面控制來說非常有實用價值。分享給大家供大家參考之用。具體分析如下:
一般在winform C/S程序中經(jīng)常會在子線程中更新控件的情況,桌面程序UI線程是主線程,當(dāng)試圖從子線程直接修改控件屬性時會出現(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); //在擁有此控件的基礎(chǔ)窗口句柄的線程上執(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#程序設(shè)計有所幫助
相關(guān)文章
C#使用iTextSharp設(shè)置PDF所有頁面背景圖功能實例
這篇文章主要介紹了C#使用iTextSharp設(shè)置PDF所有頁面背景圖功能,實例分析了C#使用iTextSharp設(shè)置PDF頁面背景圖的實現(xiàn)方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07C#獲取某路徑文件夾中全部圖片或其它指定格式的文件名的實例方法
在本篇文章里小編給大家整理的是關(guān)于C#獲取某路徑文件夾中全部圖片或其它指定格式的文件名的實例方法,需要的朋友們參考下。2019-10-10