Csharp/C#教程:BackgroundWorker – 在RunWorkerCompleted中CancellationPending更改为false。 为什么?分享


BackgroundWorker – 在RunWorkerCompleted中CancellationPending更改为false。 为什么?

取消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中以便将其提供给用户?

我相信CancellationPending属性是在后台操作期间使用的(在你的work1方法中)。 它会告诉后台工作人员您已请求取消后台操作。 调用RunWorkerCompleted事件后,后台工作程序已完成取消请求的工作,因此取消不再处于暂挂状态。

编辑:RunWorkerCompletedEventArgs有一个Canceled属性,它将告诉您后台操作是否被取消。

如果从DoWork方法(在您的情况下为work1)中抛出exception,它应该被BackgroundWorker捕获并填充RunWorkerCompletedEventArgs的Error属性。

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

这是非常有意的,它可以阻止你陷入使用线程时总是存在的令人讨厌的陷阱。 由于一种称为“线程竞争”的错误,使用线程的代码经常随机且不可预测地行为不端。 这是一种非常常见的错误,并且很难调试。

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

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

上述就是C#学习教程:BackgroundWorker – 在RunWorkerCompleted中CancellationPending更改为false。 为什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/989311.html

(0)
上一篇 2021年12月23日
下一篇 2021年12月23日

精彩推荐