- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
取消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/
因此控制台中的结果显示为 - Promise { } ' why is it still pending?' [ { _id: 5a7c6552380e0a299fa752d3, username:
据我所知,这两种设置都做同样的事情:当请求在待处理队列中花费的时间超过该设置所说的时间时,启动一个新实例。 The maximum amount of time that App Engine sh
我在进行 Entity Framework 代码优先迁移时经常遇到以下情况。我添加了一些迁移,并成功地用它们更新了数据库。稍后,当我希望添加新的迁移时,Add-Migration命令会提示其“无法生成
就我而言,我能够获取 token ,但不是我想要的方式,即我不想打印待处理的 promise ,并且在 tokenDisp.js 中运行后的输出是: output: Promise { pending
async function db(path){ const res = await fetch('data.json'); const data = await res.json();
我有一个具有PV,Service和2 Pod statefulset(包括动态PVC)的文件。 部署文件时,PVC状态发生了问题。 # kubectl get pvc NAME
我在 Azure 数据工厂服务中创建了一些管道,以将数据从 SQL 表移动到 Azure 表。但他们从不开始运行。相反,即使在我单击 Azure 门户中的运行 按钮后,源数据集仍然处于待验证状态。我已
将新的开发人员添加到启用沙盒的应用程序会在受邀的 Facebook 用户旁边显示“待处理”,并且用户永远不会收到确认电子邮件或任何允许他确认将自己添加为开发人员的信息。以前有没有人遇到过这个问题。我发
我在我的网上商店中集成了 PayPal,以便通过自动产品交付实现即时付款(之前已经有过,但仅限于通过 sofort.com 进行即时电汇)。我在 PayPal 提供的示例的帮助下集成了它(我使用的是
我有一个运行前台服务的应用程序。该应用程序有一个启动/停止按钮作为其通知的一部分,可以猜到启动和停止前台服务。单击开始按钮后,将触发一个待处理的 Intent。 考虑以下场景: 应用程序已被销毁[从最
所以, 我对 JBehave 有一种奇怪的行为。我有一个场景,我需要一个 StepDef 结构,如下所示: Given some precondition When something happens
我以前从未遇到过这样的事情,所以我希望其他人能够向我解释一下。 我正在开发一个包含一些 Adsense 横幅的网站。为了防止它们出现在我的本地主机或任何测试帐户上,我创建了一些服务器端代码来生成和
我正在学习散列字符串密码并将它们存储在对象列表中。 const bcrypt = require('bcrypt') var users = [] async function hashPass(pa
我正在遵循 Fedora 入门指南 ( https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/getting-start
我有一个更新密码功能,可以更新用户的密码并删除生成的一次性 URL。目前,它向前端和变量 updatedResult 返回空响应。说 promise 待定,所以这似乎是空响应的问题。当我执行代码时,这
我在使用 cert-manager 处理 tls 证书时遇到了问题,我正在关注文档并添加了一些额外内容以使用 Traefik作为入口。 目前,我有这个 YAML文件: cluster-issuer.y
我正在创建一个简单的辅助函数,它使用bcrypt返回给定密码的哈希值。但每次我调用该函数时,它都会解析为 Promises { }我做错了什么? const saltPassword = async
这个问题已经有答案了: How do I return the response from an asynchronous call? (42 个回答) 已关闭 4 年前。 JS 新手,我正在尝试理解
我正在为一个项目构建一个 CRUD 应用程序,人们可以添加查看和删除条目,我为此使用nodejs、js 和 fireabse。我有这样的 firestore 数据库结构: entries: --
我的服务器端有以下代码: // Bind to a specific local port number (SERVER_PORT) and any local IP address. m_tlSer
我是一名优秀的程序员,十分优秀!