C#,后台工作者

2024-01-10

我有一个示例 WinForms 应用程序,它使用BackgroundWorker成分。它工作正常,但是当我点击Cancel按钮取消后台线程,但它不会取消线程。当我击中Cancel呼叫按钮.CancelAsync()方法,然后在RunWorkerCompleted事件处理程序e.Cancelled财产永远存在false。我想当我击中Cancel按钮应将其设置为 true。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
       // Wait 100 milliseconds.
       Thread.Sleep(100);
       // Report progress.
       if (backgroundWorker1.CancellationPending == true)
       {
           //label1.Text = "Cancelled by user.";
           break;
        }

        backgroundWorker1.ReportProgress(i);
     }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // Change the value of the ProgressBar to the BackgroundWorker progress.
    progressBar1.Value = e.ProgressPercentage;
    // Set the text.
    label1.Text = e.ProgressPercentage.ToString();
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled == true)
    {
        label1.Text = "Canceled!";
    }
    else if (e.Error != null)
    {
        label1.Text = "Error: " + e.Error.Message;
    }
    else
    {
         label1.Text = "Done!";
    }
}

private void button2_Click(object sender, EventArgs e)
{
    if (backgroundWorker1.WorkerSupportsCancellation == true)
    {
        // Cancel the asynchronous operation.
        backgroundWorker1.CancelAsync();
    }
}

Canceled 属性仍然为 false,因为您跳出了循环,然后允许后台工作程序的 DoWork 函数以正常方式结束。您永远不会告诉您的后台工作人员组件挂起的取消实际上已被接受。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        // Wait 100 milliseconds.
        Thread.Sleep(100);

        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
            break;
        }

        // Report progress.
        backgroundWorker1.ReportProgress(i);
    }
}

这种区别很重要,因为有时您可能希望在检测到 CancellationPending 请求时回滚已经完成的工作,因此可能需要一段时间才能真正完成取消。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#,后台工作者 的相关文章

  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 私有模板函数

    我有一堂课 C h class C private template
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • Phonegap NFC 在两个设备之间发送和读取数据

    我正在尝试使用 ionic Angular 应用程序中的phonegap nfc 在两个支持 NFC 的设备之间发送信息 仅文本 到目前为止 我能够连接设备并且 Ndef 事件监听器捕获标签 但标签中的信息始终相同 它不会给我发送的消息 我
  • 按值对字典键进行排序,然后按字母顺序对具有相同值的键进行排序

    我知道标题中没有很好地解释 所以我会尽力在这里做得更好 我想按字典的键各自的值对它们进行排序 然后按字母顺序对具有相同值的所有键进行排序 最好不使用模块 最好的方法是什么 python 是否会自动执行此操作 如下所示 sorted dict
  • Azure 资源管理器模板 HostingEnvironment

    我从azure gallery下载了Web App MySQL的arm模板 https gallery azure com artifact https gallery azure com artifact 20151001 Microso
  • bash 获取文件的父目录

    如何获取文件的父目录 我希望它对所有类型的名称都是安全的 path to my file absolute path to my file rf no preserve root whatever test zip symbolic lin
  • TRUNCATE 和 DELETE 之间的区别? [复制]

    这个问题在这里已经有答案了 TRUNCATE and DELETE命令执行相同的工作 在这两种情况下都对数据进行操作 那么为什么DELETE命令属于 DML 命令并且TRUNCATE命令属于 DDL 命令吗 DELETE DELETE 是一
  • Jenkins 发现找不到 ssh 密钥 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当我以 jenkins 用户身份登录时 我在 ssh id rsa pub 中有一个 ssh 密钥 我已将其正确导入到 bitbucket 中 并且它
  • 从头开始水平视差滚动 - 无插件 (jQuery)

    有谁知道我是否可以找到有关如何通过js表单scratch 即无插件 进行水平视差滚动的教程 或者可以给我一个例子 我花了很多时间谷歌搜索 但只能找到使用插件的教程 我想从头开始做的原因是因为我想完美地理解视差的真正工作原理 我不介意使用jQ
  • 使用 XSLT 删除节点后消除空行

    我正在使用 XSLT 在 XML 文档中进行非常简单的转换 我只想删除所有具有特定名称的元素节点 碰巧在我的源文档中 所有这些节点都位于文档的末尾 但是在转换之后 虽然这些节点按照我的预期消失了 但在它们的位置上有很多空行 这严格来说是一个
  • WPF 中心子窗口无法使用 sizetocontent

    如果我设置SizeToContent to WidthAndHeight then WindowStartupLocation CenterOwner 不能正常工作 新窗口的中心不是位于其父窗口的中心 而是看起来更像是子窗口的左上角位于父窗
  • 解决 Unity 依赖关系问题

    当我尝试解决我的工作单元时 我收到此错误 IUnitOfWork 类型没有可访问的构造函数 但是 只有当我将 unitOfWork 的 LifetimeManager 设置为 PerResolveLifetimeManager 时 才会发生
  • 如何从 Windows 命令行启动 Git Bash?

    我希望这是一个简单的问题 但我还没有找到答案 我想从 Windows 批处理文件启动 Git Bash 这是我到目前为止所尝试的 从 Windows 7 开始按钮启动 Git Bash 使用 CTRL ALT DEL 将进程识别为 sh e
  • 我如何改进这个 C# 随机方法?

    我想我已经决定将其作为随机列表的最简单且可进行单元测试的方法 但有兴趣听到任何改进 public static IList
  • 我的 Android AChartEngine 已经可以工作了,但是如何让它看起来更好呢?

    我想标题已经解答了我的大部分问题 但让我们详细介绍一下背景 我有一个主要针对平板电脑的 Android 应用程序 它将在 TimeCharts 中显示一些不同的实时数据 因此 我已经有一个与数据源通信的服务 该数据源获取数据 解析数据并将值
  • 这里有人使用Linux主机/VMWare/VirtualKD调试环境吗?

    有没有人有过成功的经验虚拟KD http virtualkd sysprogs org在运行 VMWare Workstation 8 带有 Win7 客户机 的 Linux 主机上进行设置 尽管事实上有很多关于 VirtualKD 的 速
  • 选择/插入/更新表字段数据时修剪空格(前导和尾随)是一个好习惯吗?

    假设空格在字段数据中并不重要 那么在插入 更新或从表中选择数据时修剪空格是一个好习惯吗 我想象不同的数据库以不同的方式实现空格处理 因此为了避免这种头痛 我认为我应该禁止任何字段数据中的前导和尾随空格 你怎么认为 我认为这是一个很好的做法
  • Android 中 EditText 的不同颜色

    我正在尝试使 EditText 的文本具有多种颜色 例如 如果我的文本是 It is a good day 是否可以将句子的 It is a 部分设置为绿色 其余部分设置为红色 我用类似的东西使我的颜色的某些部分变成绿色 final Str
  • 使用 Ninject 具有多个参数的构造函数

    我正在尝试使用Ninject http www ninject org 作为 IoC 容器 但无法理解如何创建在构造函数中具有超过 1 个参数的类的实例 基本上 我有一个用于在 PCL 库中进行身份验证的服务接口 及其在 WP8 项目中的实
  • 我应该使用什么协议来进行快速命令/响应交互?

    我需要建立一个用于快速命令 响应交互的协议 我的直觉告诉我只需将一个简单的协议与 CRLF 分隔的 ascii 字符串拼凑在一起 就像 SMTP 或 POP3 的工作方式一样 如果我需要保护它 则可以通过 SSH SSL 对其进行隧道传输
  • PHP 是否优化尾递归?

    我写了一小段代码 我相信如果尾递归被优化的话应该会成功 但是它炸毁了堆栈 我应该得出 PHP 没有优化尾递归的结论吗 function sumrand n sum if n 0 return sum else return sumrand
  • C#,后台工作者

    我有一个示例 WinForms 应用程序 它使用BackgroundWorker成分 它工作正常 但是当我点击Cancel按钮取消后台线程 但它不会取消线程 当我击中Cancel呼叫按钮 CancelAsync 方法 然后在RunWorke