暂停和恢复 BackgroundWorker
Pausing and resuming BackgroundWorker
我一直在想,有什么方法可以让 BackgroundWorker 像线程一样进入睡眠状态并再次恢复。我已经在许多论坛中搜索过,但没有结果。 None 其中显示了可以做到这一点的任何方法。我查看了 Microsoft 文档,发现没有任何预定义的方法。
我知道使用 resetEvents 的解决方法。只是要求任何其他可能和更简单的方法。
在您的 DoWork
处理程序中,您可以随时调用 Thread.Sleep()
。如果您希望从 GUI 向工作人员发出暂停信号,设置并发队列,将您的睡眠请求从 GUI 线程输入其中,并让您的 DoWork
处理程序定期检查队列,暂停根据要求。
(如果你想暂停 BackgroundWorker
直到再次发出信号 而不是暂停一段时间,你可以用类似的方式做到这一点 - 只是定期检查队列中的 "restart" 命令并在再次检查前休眠几毫秒。)
如果您使用 Task 而不是 BackgroundWorker,则可以使用 PauseTokenSource.
这个class类似于内置的CancellationTokenSource只适用于暂停任务而不是取消它们。
PauseTokenSource API 正是为满足您的需求而构建的,它 API 可以替代您对 Thread.Sleep 和所有信号事件的使用。
除了PauseTokenSource 之外的其他选项可以使用AsyncManualResetEvent, the mechanism internal is quite similar but they differ in the API. I think that PauseTokenSource is much more convenient and especially built for this purpose, more info here。
我一直在想,有什么方法可以让 BackgroundWorker 像线程一样进入睡眠状态并再次恢复。我已经在许多论坛中搜索过,但没有结果。 None 其中显示了可以做到这一点的任何方法。我查看了 Microsoft 文档,发现没有任何预定义的方法。
我知道使用 resetEvents 的解决方法。只是要求任何其他可能和更简单的方法。
在您的 DoWork
处理程序中,您可以随时调用 Thread.Sleep()
。如果您希望从 GUI 向工作人员发出暂停信号,设置并发队列,将您的睡眠请求从 GUI 线程输入其中,并让您的 DoWork
处理程序定期检查队列,暂停根据要求。
(如果你想暂停 BackgroundWorker
直到再次发出信号 而不是暂停一段时间,你可以用类似的方式做到这一点 - 只是定期检查队列中的 "restart" 命令并在再次检查前休眠几毫秒。)
如果您使用 Task 而不是 BackgroundWorker,则可以使用 PauseTokenSource.
这个class类似于内置的CancellationTokenSource只适用于暂停任务而不是取消它们。
PauseTokenSource API 正是为满足您的需求而构建的,它 API 可以替代您对 Thread.Sleep 和所有信号事件的使用。
除了PauseTokenSource 之外的其他选项可以使用AsyncManualResetEvent, the mechanism internal is quite similar but they differ in the API. I think that PauseTokenSource is much more convenient and especially built for this purpose, more info here。