2014-01-12 54 views
1

我已經實施了堆棧溢出問題的解決方案Implement progressbar in this simple WPF applicationWPF和後臺工作者和調用線程必須是STA

MainWindow有它自己的視圖模型。在該視圖模型中,我收到用戶的輸入並使用後臺工作人員使用WCF服務。在WCF提供數據後,我試圖在新窗口中顯示它。這是發生錯誤的地方:

調用線程必須是STA,因爲許多UI組件需要 這個。

我試圖把[STAThread]屬性的主窗口code-behind還有MainWindowViewModel構造器內。在這兩種情況下都沒有改變

我錯過了什麼?

更新 用戶點擊命令後,在視圖模型調用LoadData方法

private void LoadData(string searchBy) 
{ 
    IsBusy = true; 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += (o, ea) => 
    { 
     switch (searchBy) 
     { 
      // WCF call to load data 
     } 
    } 

    worker.RunWorkerCompleted += (o, ea) => 
    { 
     IsBusy = false; 
    }; 

    worker.RunWorkerAsync(); 
+0

你在哪裏創建'BackgroundWorker'? – Douglas

+1

消息中的「調用線程」不是您的UI線程。這是WCF回調線程。您需要使用Dispatcher,SynchronizationContext等將該後臺線程的調用編組到您的UI線程中。 –

+0

@Douglas我在按鈕單擊後使用wcf調用來創建BackgroundWorker。 – user1765862

回答

6

Stack Overflow上有很多這個問題的重複。例如,this question。底線 - 無論何時您創建UI組件,您都必須使用單線程單元(STA)線程。後臺工作人員不是STA。因此,您無法在後臺工作人員中創建UI組件。您無法從後臺工作人員更新UI組件。後臺工作人員被設計爲在後臺運行(有很大的驚喜),可能會收集數據並在稍後返回結果。

+0

因此,當後臺工作人員需要某些用戶交互時,無法獲得它? –

+0

按照定義,後臺工作人員不需要用戶交互。你的設計有一個合理的問題需要解決。 – theMayer

3

我認爲你需要使用Application.Current.Dispatcher.BeginInvoke(action)。這是從後臺線程更新UI。

相關問題