2010-01-25 58 views
1

以下是我正在嘗試解決的問題:BackgroundWorker是AsyncOperationManager的良好子類嗎?

我的類(可以由UI應用程序或Windows服務或其他任何東西託管)需要接收Windows消息。在這裏的某個地方,有人給出了建議(和一些源代碼)在獨立的線程中創建窗體窗體,該窗體將創建窗體,並且每當我感興趣的窗口消息在WndProc上收到時,它就會使用上下文觸發委託.POST。

我一直在努力讓它工作,但不成功。與其在這條途徑上花費更多時間,並且在我嘗試複製問題之前,我正在那裏發佈此處尋求幫助,我想我會嘗試使用BackgroundWorker實施相同的解決方案。

從我所做的測試中,我期望它在我使用UI時工作得很好,但我的問題是:有沒有在不處理UI時使用BackgroundWorker的建議?

編輯: 我預想的方式,每一個我的「孩子」的形式(一在後臺運行的工人)接收郵件時,我會發出ReportProgress。我需要通過線程傳遞的唯一信息是消息ID,因此技術上它應該足夠了嗎?

+0

你打算從後臺工作人員更新UI的頻率如何? – SwDevMan81 2010-01-25 19:42:38

+0

我認爲最大。頻率應該大約每5秒一次......但正常情況下每2到10分鐘一次。 – 2010-01-25 19:56:18

回答

1

BackgroundWorker和一個窗口是水和火。一個窗口需要一個STA線程和一個消息循環,兩者都不由BGW提供。在this thread檢查我的答案替代。

+0

非常有趣。我在你原來的帖子上留下了一個問題,但我會在這裏問問。 我開始使用SynchronizationContext的原因是事實(至少我能理解),它並不要求主機在UI層,因此不需要調用Invoke。 如果DeviceChangeNotifier的客戶端是在NT服務上運行的庫,您仍然可以使用您的模型嗎? – 2010-01-25 21:03:52

+0

該代碼實際上沒有做任何事情來將事件調用編組到另一個線程,它在後臺線程上引發。您必須根據需要自行添加同步。在服務中不應該這樣做,你不能同步任何東西。 – 2010-01-25 21:08:52

1

我會說如果它最多每5秒鐘一次,那麼你應該很好地通過ReportProgress事件傳遞消息ID(作爲userState)返回。

+0

如果讓我們說每一秒或100ms的順序,爲什麼不是這種情況? – 2010-01-25 20:43:04

+0

由於用戶界面將無響應:http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/9ea431a7-588d-4452-a711-42e64338ac7e/ – SwDevMan81 2010-01-25 21:04:02

+0

更詳細的迴應在這裏:http: //social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/ee8b2e1e-a614-41ce-8707-cc31215dd758/ – SwDevMan81 2010-01-25 21:06:22

0

BackgroundWorker對象是執行您要執行的任務的絕佳方法。但是,您可能會發現,當您編寫代碼時,簡單的消息ID已經不夠用,但BackgroundWorker.ReportProgress方法允許您傳入狀態對象。如果你編寫了一個高效的狀態對象,你可以從字面上發回完整的快照以回報父表單。

相關問題