Dot-Net

“呼叫執行緒必須是 STA,因為許多 UI 組件都需要這個”線上程中創建 WPF 彈出視窗時出現錯誤

  • April 29, 2020

我有一個 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,我們必須知道兩件事:

  1. 使用 Dispatcher 的方式太多了,比如 Dispatcher_Operation , $$ window.dispatcher $$或等等。
  2. 我們必須*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();

引用自:https://stackoverflow.com/questions/2657212