2012-01-24 64 views
0

我不認爲我已經完全找到了我正在尋找的東西,並且不確定是否可能......我已經與後臺工作人員合作完成流程,並且在某些「 ProgressChanged「事件來從後臺工作者提取消息並更新給定的窗口對話框。沒問題。創建新窗口,同時來自後臺工作人員

新項目...在我試圖在後臺工作器上運行的某個過程中,根據某些條件,我需要它在恢復其操作之前實際調用新窗口對話框以獲取用戶輸入。 。在僞格式..

Start Window 
Click Button For Action 
Create BackgroundWorker (BGW) and enable progress changed 
Link BGW "ProgressChanged" to CurrentWindowCheckProgress method 
run BGW process 

在BGW,在一定條件下,我更新進度並具有旗幟的BGW,我需要特定對話X要被顯示給用戶。因此,通過ReportProgress(),CurrentWindowCheckProgress方法的鉤子被觸發(在UI線程上)。此方法看到該標誌並需要創建一個新的Window(),從中獲得答案,然後返回到BGW線程繼續。

到目前爲止,所有的邏輯工作按計劃進行,但我得到一個錯誤

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

那麼,我需要做些什麼來向用戶顯示我的臨時表格「TestPromptWindow」。

這是C#,WPF,VS2010,.NET 4.0

+0

你可以發佈你用來顯示TestPromptWindow的代碼嗎? –

+1

它肯定聽起來不像你實際使用ProgressChanged事件。不能像你所描述的那樣工作,調用ReportProgress()不會阻止BGW線程。您將不得不在工作人員中使用Dispatcher.Invoke()。 –

回答

0

這不是背景工作者所設計的。 BGW爲您提供的消息傳遞完全是異步的。從技術上講,可以使用Control.Invoke在UI線程上運行代碼,但這可能是因爲進度更新可能導致此Invoke調用不按順序運行,因爲它可能具有不同的消息優先級。

.NET的下一個版本將爲此提供非常好的支持。同時,您可以使用Task類,特別是其continueWith成員。 Here是一個很好的例子,展示瞭如何來回UI線程。

+0

對不起,這麼晚迴應......在完成任務之後,我完全撇下了回到這裏的信用。 – DRapp

+0

不客氣! – 2012-03-14 19:08:38

1

能告訴你的CurrentWindowCheckProgress內容?我不確定您在向用戶展示窗口時如何防止BackgroundWorker工作。如果您嘗試在非UI線程上執行一些UI代碼,該錯誤看起來像。如果是這種情況,請嘗試使用Dispatcher.Invoke(...)方法調用這段代碼。