2016-09-30 180 views
0

我一直在想,有沒有什麼辦法可以將BackgroundWorker移動到睡眠狀態並像線程一樣再次恢復。我在很多論壇上徒勞地搜索過。他們都沒有顯示任何會做到這一點的方法。我檢查了微軟文檔,發現沒有任何預定義的方法。暫停和恢復BackgroundWorker

我知道使用resetEvents的解決方法。只是要求任何其他可能的和更簡單的方法。

+0

BackgroundWorker已過時。任務可以通過任務並行庫以更好的方式完成。正如@SomeUser所回答的,您可以暫停任務。 –

回答

0

從您的DoWork處理程序中,您可以隨時撥打Thread.Sleep()。如果您希望從GUI中能夠發信號通知工作人員暫停,設置併發隊列,從GUI線程向您的睡眠請求提供請求,並讓您的處理程序定期檢查隊列,並根據請求暫停。

(如果你想暫停BackgroundWorker直到再次暗示,而不是針對某一段時間,你可以做,以類似的方式 - 只需定期檢查隊列中「重新啓動」命令而睡,幾毫秒後再檢查。)

+0

我還可以爲睡眠添加時間限制,並且在一定時間後,我可以取消該線程。那會奏效,不是嗎? – Prajwal

+0

我並不完全確定我理解你。是的,您可以通過隊列傳遞睡眠超時。如果要從GUI線程取消'BackgroundWorker',請使用內置的[CancelAsync方法](https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.cancelasync(v = vs.110).aspx),然後檢查工作人員應定期檢查'CancellationPending'是否爲'true'。 – adv12

+0

肯定給@ SomeUser的回答一下。我認爲他們提出了一個更好的解決方案,如果你可以使用'Task'。 – adv12

3

如果您使用Task而不是BackgroundWorker,則可以使用PauseTokenSource

該課程類似於內置的取消指定源僅適用於暫停任務並且不取消它們。

PauseTokenSource API完全是爲您需要構建的,它的API可以替代您對Thread.Sleep和所有信號事件的使用。

除PauseTokenSource之外的其他選項可以使用AsyncManualResetEvent,機制內部非常相似,但它們在API中有所不同。我認爲PauseTokenSource更方便,特別爲此構建,更多信息here

+0

它工作正常,但是當您需要將進度報告回UI時,BackgroundWorker的實現更加容易和有用。隨着任務,這將是繁瑣的。 – Prajwal

+0

您可以使用任務以非常簡單的方式向UI回報進度http://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html – YuvShap

+0

任務是下一代BackgroundWorker http://stackoverflow.com/questions/3513432/task-parallel-library-replacement-for-backgroundworker – YuvShap