2016-09-30 185 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