C 子執行緒更新UI控制項的方法總結

2022-09-16 22:51:17 字數 1397 閱讀 3484

在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 使用控制...