gpt4 book ai didi

c# - 如何处理这种竞争条件?

转载 作者:太空宇宙 更新时间:2023-11-03 20:38:41 25 4
gpt4 key购买 nike

在我的类里面,我使用 BackgroundWorker。在某些时候,我需要取消正在进行的异步操作并立即开始另一个操作。代码如下。我不确定的一件事是,如果工作人员在我将我的 lambda 分配给 RunWorkerCompleted 事件之前完成,可能会发生竞争条件。如果发生这种情况,我的 lambda 将永远不会被调用。代码中的注释显示了这个地方。关于如何处理这个有什么意见吗?

谢谢康斯坦丁


if (this.worker.IsBusy)
{
RunWorkerCompletedEventHandler f = null;

f = (s, v) =>
{
this.RunWorkerCompleted -= f;
this.worker.RunWorkerAsync();
};

// what if worker completes right before the following statement?
this.worker.RunWorkerCompleted += f;
this.worker.CancelAsync();
}
else
{
this.worker.RunWorkerAsync();
}

最佳答案

只要此代码在主线程上运行,就不会发生竞争。 BGW 只能在 RunWorkerCompleted 事件处理程序完成运行时完成。在主线程重新进入消息循环之前,处理程序无法开始运行。

还有另一种竞争,由 else 子句引起。您让 BGW 在没有 RunWorkerCompleted 事件处理程序的情况下启动。现在它可以异步完成,因为它不会被阻塞。 总是订阅事件,测试e.Cancelled就知道发生了什么。

关于c# - 如何处理这种竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014734/

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