WPF [調用線程無法訪問此對象,因為另一個線程擁有該對象。] 與 Winfrom [線程間操作無效: 從不是創建控件“label1”的線程訪問它。]錯誤同屬於在線程中操作界面UI元素導致。
解決方法:
WPF:Dispatcher.Invoke 方法,只有在其上創建 Dispatcher 的線程才可以直接訪問 DispatcherObject。若要從不同於在其上創建 DispatcherObject 的線程的某個線程訪問 DispatcherObject,請對與 DispatcherObject 關聯的 Dispatcher 調用 Invoke 或 BeginInvoke。需要強制線程安全的 DispatcherObject 的子類可以通過對所有公共方法調用 VerifyAccess 來強制線程安全。這樣可以保證調用線程是在其上創建 DispatcherObject 的線程。
代碼:
- this.lbl.Dispatcher.Invoke(new Action(()=>{ this.lbl.Text = "this is a test!!!"; }));
Winfrom:Control.Invoke 方法 (Delegate),在擁有此控件的基礎窗口句柄的線程上執行指定的委托。
代碼:
- this.lbl.Invoke(new Action(()=>{ this.lbl.Text = "this is a test!!!"; }));