gpt4 book ai didi

.net - 取消BackgroundWorker,如何在已经完成时防止比赛

转载 作者:行者123 更新时间:2023-12-04 19:23:23 25 4
gpt4 key购买 nike

我正在使用 BackgroundWorker 来执行长时间的计算(一次只有一个这样的计算)。

用户可以取消worker(调用worker.CancelAsync)。

在 worker.DoWork 方法中,我会定期检查取消挂起标志,然后从该方法返回。

然后从工作人员那里引发 Completed 事件,我可以检查工作人员是否被取消。此外,这很重要,当检测到取消时,我会进行一些额外的清理。

我敢肯定,如果用户取消工作人员并且它已经从 DoWork 方法返回,则可能会出现问题。在那种情况下,我真的很想知道 worker 被取消了,所以我可以清理......

有没有更好的方法来处理 worker 的取消程序,并进行清理?

最佳答案

您的 DoWork事件处理程序应定期检查 BackgroundWorker.CancellationPending , 并设置 DoWorkEventArgs.Cancel如果它被取消,则在返回之前为 true。

您的 RunWorkerCompleted事件处理程序应检查 RunWorkerCompletedEventArgs.Cancelled属性来确定 DoWork事件处理程序已取消(设置 DoWorkEventArgs.Cancel 为 true)。

如果出现竞争条件,可能会发生用户请求取消(BackgroundWorker.CancellationPending 为真)但工作人员没有看到它(RunWorkerCompletedEventArgs.Cancelled 为假)。您可以测试这两个属性以确定是否发生了这种情况,并执行您选择的任何操作(将其视为成功完成 - 因为工作人员确实成功完成了,或者视为取消 - 因为用户已取消并且不关心任何更多的)。

我没有看到任何对所发生的事情有任何歧义的情况。

编辑

回应评论-如果有几个类需要检测CancellationPending ,除了向这些类传递对诸如 BackgroundWorker 之类的类型的引用之外,别无选择。这使他们能够检索此信息。您可以将其抽象为一个接口(interface),这就是我在对有关 BackgroundWorkers 的问题的回复中所描述的通常所做的事情。但是您仍然需要将实现此接口(interface)的类型的引用传递给您的工作程序类。

如果您希望您的 worker 类(Class)能够设置 DoWorkEventArgs.Cancel您将需要传递对此的引用,或者采用不同的约定(例如 bool 返回值或自定义异常),以允许您的工作类指示已发生取消。

关于.net - 取消BackgroundWorker,如何在已经完成时防止比赛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com