C#子線程更新UI控件的辦法實例總結。本站提示廣大學習愛好者:(C#子線程更新UI控件的辦法實例總結)文章只能為提供參考,不一定能成為您想要的結果。以下是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屬性
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 >/界說一個拜托</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辦法了,代碼完成:
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(); }
願望本文所述對年夜家的C#法式設計有所贊助