在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屬性
[csharp]copy
private void button6_click(object sender, eventargs e)
void threadmethod()
;/"font-family: arial, helvetica, sans-serif;">/定義乙個委託
label1.invoke(asyncuidelegate,new object);
}2.使用synchronizationcontext的post/send方法更新
synchronizationcontext類在system.threading命令空間下,可提供不帶同步的自由執行緒上下文,其中post方法簽名如下:
public virtual void post(sendorpostcallback d,object state) //將非同步訊息排程到乙個同步上下文
可以看出我們要非同步更新ui控制項,第一是要獲取ui執行緒的上下文了,第二就是呼叫post方法了,**實現:
[csharp]copy
synchronizationcontext _synccontext = null;
private void button6_click(object sender, eventargs e)
//窗體建構函式
public form1()
private void threadmethod()
private void setlabeltext(object text)
子執行緒更新UI
一般在winform c s程式中經常會在子執行緒中更新控制項的情況,桌面程式ui執行緒是主線程,當試圖從子執行緒直接修改控制項屬性時會出現 從不是建立控制項的執行緒訪問它 的異常提示。跨執行緒更新ui控制項的常用方法有兩種 1.使用控制項自身的invoke begininvoke方法 2.使用sy...
C 子執行緒改變UI的方法
相信許多人在使用winform時候經常會遇到在自己新起乙個執行緒test 稱為輔助線程 當在test中要修改主介面的一些內容時,經常會出現一些異常,具體什麼型別異常不做解釋,直說解決方法 code public partial class test form public void test pub...
WPF跨執行緒更新UI控制項
1.預設情況下,在windows應用程式中,net framework不允許在乙個執行緒中直接操作另乙個執行緒中的控制項。winform中實現跨執行緒操作控制項的兩種方法 1 關閉執行緒安全檢查 control.checkforillegalcrossthreadcalls false 2 使用控制...