2010-09-01 224 views
2

任何人都可以解釋我,我怎麼能在BackgroundWorker線程中創建WPF窗口沒有錯誤?如何在BackgroundWorker中創建WPF窗口?

我有一些類(WPF窗口):

public partial class Captcha : Window 
    { 
     public Captcha() 
     { 
      InitializeComponent(); 
     } 

     private void SendCaptchaBtn_Click(object sender, RoutedEventArgs e) 
     { 
      DialogResult = true; 
      this.Close(); 
     } 
    } 

在BackgroundWorker的的DoWork的功能我試圖創建與此窗口中的對象:

BackgroundWorker bgWorker = new BackgroundWorker(); 
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 
bgWorker.RunWorkerAsync(); 

void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
       parser = new Parser(); 
       parser.ParseFunc(tempKeywords); 
     } 

解析器對象有一個 「驗證碼」 Window:

Captcha captcha_dlg = new Captcha(); 

當我運行程序時,在Captcha-class poi的構造函數中有運行時錯誤nt:調用線程必須是STA,因爲許多UI組件都需要這個。 怎麼了? Thansk幫助和抱歉,我的英語不好:(。

回答

4

簡短的回答是,你不能。

通過BackgroundWorker使用的任何線程是MTA線程,因爲他們來自線程池,沒有辦法是啓動後從MTA線程切換到STA。

如果你想在另一個線程創建UI,最好的辦法是通過調用SetApartmentState()使用Thread類,並啓動前將其設置爲STA。

+0

謝謝,現在它工作:)。這是最佳解決方案 - 針對每個異步。函數/進程在我的程序中創建另一個線程? 那麼Dispatcher呢?它就像MethodInvoker和Windows窗體應用程序中的代表一樣,例如可能需要訪問主窗口中的一些控件? :) – Dmitriy 2010-09-01 19:14:27

+0

@Dmitriy如果你問是否最適合爲程序正在執行的每個異步事件創建一個新線程,如果你想在該線程上顯示UI,我不會看到另一種方式,因爲WPF必須運行在STA線程。 – Andy 2010-09-01 19:41:39

+0

在同一個線程上有兩個窗口並不是一個大問題,因爲繁重的工作通常是異步完成的(在另一個線程上) – JoshVarga 2010-09-01 21:41:58