Sté*_*écy 5 .net multithreading backgroundworker
我正在使用BackgroundWorker来执行长计算(一次只有一个这样的计算).
用户可以取消工作者(调用worker.CancelAsync).
在worker.DoWork方法中,我定期检查取消挂起标志,然后从方法返回.
然后从工人中提出已完成事件,我可以检查该工作人员是否已被取消.此外,这是重要的事情,当检测到取消时,我会做一些额外的清理工作.
我确信如果用户取消该工作并且它已经从DoWork方法返回,则可能存在问题.在那种情况下,我真的想知道工人被取消所以我可以清理......
是否有更好的方法来处理工人的清理取消程序?
您的DoWork事件处理程序应定期检查BackgroundWorker.CancellationPending, 并DoWorkEventArgs.Cancel在返回之前设置为 true (如果事件被取消)。
您的RunWorkerCompleted事件处理程序应检查该RunWorkerCompletedEventArgs.Cancelled属性以确定DoWork事件处理程序是否已取消(设置DoWorkEventArgs.Cancel为 true)。
如果出现竞争条件,可能会发生用户请求取消(BackgroundWorker.CancellationPending为 true)但工作人员没有看到它(RunWorkerCompletedEventArgs.Cancelled为 false)的情况。您可以测试这两个属性以确定是否发生了这种情况,并执行您选择的任何操作(要么将其视为成功完成 - 因为工作人员实际上已成功完成,要么将其视为取消 - 因为用户已取消并且不关心任何更多的)。
我没有看到任何情况对所发生的事情有任何含糊之处。
编辑
作为对评论的回应 - 如果有多个类需要检测,那么除了向这些类传递对类型的引用(例如允许它们检索此信息)CancellationPending之外,实际上没有其他选择。BackgroundWorker您可以将其抽象为一个接口,这就是我通常所做的,如对有关后台工作人员的问题的回答中所述。但是您仍然需要将对实现此接口的类型的引用传递给您的工作器类。
如果您希望您的工作程序类能够进行设置,DoWorkEventArgs.Cancel您将需要传递对此的引用,或者采用不同的约定(例如布尔返回值或自定义异常),以允许您的工作程序类指示已发生取消。
| 归档时间: |
|
| 查看次数: |
2270 次 |
| 最近记录: |