Dot-Net
“呼叫執行緒必須是 STA,因為許多 UI 組件都需要這個”線上程中創建 WPF 彈出視窗時出現錯誤
我有一個 WPF 應用程序,其中一個執行緒檢查一些值。在某些情況下,我會顯示一個彈出視窗
Window以顯示消息。當我線上程中創建這個彈出視窗時,彈出視窗的建構子會拋出異常:“呼叫執行緒必須是 STA,因為很多 UI 組件都需要這個。”
如何解決此錯誤?
這是我創建彈出視窗的程式碼:
// using System.Threading; // using System.Windows.Threading; Thread Messagethread = new Thread(new ThreadStart(delegate() { DispatcherOperation DispacherOP = frmMassenger.Dispatcher.BeginInvoke( DispatcherPriority.Normal, new Action(delegate() { frmMassenger.Show(); })); })); Messagethread.Start();
當我們在 WPF 中使用多執行緒時,絕對*
Dispatcher*是做某事(在特定執行緒中)的唯一方法!但是要使用 Dispatcher,我們必須知道兩件事:
- 使用 Dispatcher 的方式太多了,比如 Dispatcher_Operation , $$ window.dispatcher $$或等等。
- 我們必須*
call dispatcher in the main thread of app*(該執行緒必須是 STA 執行緒)*例如:如果我們想顯示其他視窗$$ wpf $$***在另一個執行緒中,我們可以使用以下程式碼:
Frmexample frmexample = new Frmexample(); frmexample .Dispatcher.BeginInvoke //Updated the variable name (System.Windows.Threading.DispatcherPriority.Normal, (Action)(() => { frmexample.Show(); //---or do any thing you want with that form } ));提示:
Remember - we can't access any fields or properties from out dispatcher, so use that wisely
對於您嘗試在其中啟動 GUI 元素的執行緒,您需要在啟動它之前將執行緒的單元狀態設置為 STA 。
例子:
myThread.SetApartmentState(ApartmentState.STA); myThread.Start();