c#中不允許跨執行緒直接訪問介面控制項,即乙個執行緒中如主線程建立的控制項不允許被其他執行緒例如子執行緒直接訪問,如果直接訪問或設定屬性則會爆出「呼叫執行緒無法訪問此物件,因為另乙個執行緒擁有該物件」等類似錯誤。
在乙個執行緒中設定其他執行緒所有的控制項屬性通常有兩種方法,一是設定system.windows.forms.control的checkforillegalcrossthreadcalls屬性值為false,表示不對錯誤執行緒的呼叫進行捕捉,這種方法只對winforms介面框架有效,在wpf中無法設定該屬性,只能使用第二種方法。
第二種方法是通過委託來實現控制項屬性設定,需要通過invoke或begininvoke來實現,invoke表示同步,begininvoke表示非同步,下面列舉了在winforms中和wpf兩種介面框架中跨執行緒訪問控制項的**示例。
一般的委託方法示例**如下:
delegate
void
delegatesettext
(string str)
;//定義乙個委託
private
void
settext
(string str));
return;}
textbox01.text = str;
}
也可以採用匿名**的方式,示例**如下:
delegate
void
delegatesettext
(string str)
;//定義乙個委託
private
void
settext
(string str)
invoke
(delegatesettext01,
newobject
);}
在wpf中跨執行緒訪問控制項需要使用dispatcher。dispatcher是wpf中的執行緒排程管理器,用在子執行緒重新整理主線程(ui執行緒)(比如繫結的時候,屬性更新的時候),在子執行緒裡面起乙個dispatcher,將工作專案排程到 ui 執行緒,讓主線程排程重新整理ui的**。示例**如下:
private
void
settext
(string str)
textbox01.text = str;
}
c#中invoke的用法()
不支援從排程程式執行緒以外的執行緒對其 sourcecollection 進行的更改
【c#】呼叫執行緒無法訪問此物件,因為另乙個執行緒擁有該物件
invokerequired和invoke
invokerequired in wpf [duplicate]
c# 跨執行緒呼叫textbox方法** 利用settextcallback方法
c 跨執行緒訪問控制項
訪問 windows 窗體控制項本質上不是執行緒安全的。如果有兩個或多個執行緒操作某一控制項的狀態,則可能會迫使該控制項進入一種不一致的狀態。還可能出現其他與執行緒相關的 bug,包括爭用情況和死鎖。所以,確保以執行緒安全方式訪問控制項是非常重要的。private static object dat...
跨執行緒訪問控制項
using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.text u...
跨執行緒訪問控制項
程序是作業系統分配資源的最小單位,程序之間隔離,作為資源的擁有者,在建立 cpu處理時切換以及撤銷的過程中花費時間較長,而執行緒是作業系統任務排程的最小單元,對於每個程序中由多個列表內容執行緒執行對應的方法體,完成後立即釋放,這樣作業系統對執行緒處理起來更加容易,實現了併發程式。using syst...