gpt4 book ai didi

c# - BackgroundWorker - Cancellation Pending 在 RunWorkerCompleted 中更改为 false。为什么?

转载 作者:太空狗 更新时间:2023-10-30 00:05:27 27 4
gpt4 key购买 nike

取消BackGroundWorker后,在DoWork中,CancellationPending为true,但是当他来到RunWorkerCompleted时,CancellationPending为false。我不知道我做错了什么?

static BackgroundWorker b1;

static void Main(string[] args)
{
b1=new BackgroundWorker();
b1.DoWork += new DoWorkEventHandler(work1);
b1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(completed);
b1.WorkerSupportsCancellation = true;
b1.RunWorkerAsync("Hellow");
Console.ReadLine();
}

private static void completed(object sender, RunWorkerCompletedEventArgs e)
{
if (((BackgroundWorker)sender).CancellationPending)
Console.WriteLine("Canceled!");
else
Console.WriteLine("Result:" + e.Result);//it goes here every time
}

private static void work1(object sender, DoWorkEventArgs e)
{
((BackgroundWorker)sender).CancelAsync();
if (((BackgroundWorker)sender).CancellationPending)
{
e.Cancel = true;
}
}

顺便问一下,如何将 DoWork 中发生的错误添加到 RunWorkerCompletedEventArgs.Error 以将其告知用户?

最佳答案

是的,BackgroundWorker 类在引发 RunWorkerCompleted 事件之前将 CancellationPending 属性设置为 false。 worker 是否真的被取消了。

这是有意为之的,它可以防止您陷入使用线程时始终存在的令人讨厌的陷阱。由于一种称为“线程竞争”的错误,使用线程的代码通常会出现随机且不可预测的错误行为。这是一种非常常见的错误,很难调试。

如果 BGW 没有这样做,您的预期方法很容易出错的是,当您看到 CancellationPending 设置为 true 时,您会假设工作人员被取消。但那是一种错觉,你无法分辨它被取消和正常完成之间的区别。极端情况是您在工作人员完成前一微秒调用 CancelAsync()。工作人员甚至没有机会看到 CancellationPending 标志设置为 true,它正忙于完成 DoWork 事件处理程序方法的最后几位。那是一场线程竞赛,worker 跑在你的调用之前并正常完成。

避免此错误的正确握手是您的工作人员在看到 CancellationPending 属性设置为 true 时将 e.Cancel 设置为 true。当然还有停止它正在做的事情。现在可靠了,RunWorkerCompleted 事件处理程序中的 e.Cancelled 属性是 e.Cancel 的副本。因此,您的代码现在可以可靠地告诉您工作人员是否看到了取消请求。

关于c# - BackgroundWorker - Cancellation Pending 在 RunWorkerCompleted 中更改为 false。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11709937/

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