程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#子線程更新UI控件的辦法實例總結

C#子線程更新UI控件的辦法實例總結

編輯:C#入門知識

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved