2010-04-17 49 views
12

我有一個線程檢查某個值的WPF應用程序。在某些情況下,我會彈出一個彈出框Window以顯示一條消息。當我在線程創建這個彈出窗口,一個異常被彈出窗口的構造函數拋出:「調用線程必須是STA,因爲很多UI組件需要這個」在線程中創建WPF彈出窗口時出現錯誤「

「調用線程必須爲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(); 
+1

我找到了問題的根本。我有一個計時器,在每個timer.tick中,檢查新消息,然後顯示每條新消息。定時器線程使我的工作如此艱難。 – Rev 2010-04-18 10:00:30

+1

題外話:在WPF中,windows只是被稱爲:「windows」;不是「形式」。後一個術語在另一個UI框架Windows Forms中使用。 – stakx 2013-08-20 07:48:53

+0

@stakx:謝謝 – Rev 2013-08-20 18:59:54

回答

9

絕對Dispatcher只是做一些事情(在線程),當我們在WPF多線程的工作方式!

但對於調度員的工作,我們必須知道兩兩件事:

  1. 太多的方式來使用調度像Dispatcher_Operation, [window.dispatcher]或等
  2. 我們必須call dispatcher in the main thread of app(線程是必須是STA線程)

因此,例如:如果我們想顯示其它窗口[WPF]在另一個線程,我們可以使用此代碼:

Frmexample frmexample = new Frmexample(); 
      Frmexample .Dispatcher.BeginInvoke 
       (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

13

對於你的線程,你想,你需要設置你的線程STA的公寓狀態啓動GUI元素之前你開始吧。

例子:

​​
+0

@Rev:讓我知道,如果它沒有超過你的錯誤,讓我知道錯誤信息,我會提供你需要的額外信息。我認爲這就是你所需要的。 – 2010-04-17 16:58:07

+0

thx求助 但這並不奏效。 這個問題與Wpf和Threading有關。我認爲我們應該使用Dispatcher來解決這個問題。 Regards Rev – Rev 2010-04-18 04:44:30

+2

@Rev:可能你有兩個問題。穿線STA和調度員。如果你需要調度員的幫助,請告訴我,我可以告訴你如何。 – 2010-04-18 04:47:18

相關問題