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#法式設計有所贊助