取消BackgroundWorker

2024-01-04

我在 winforms 应用程序中使用 BackgroundWorker 来执行另一个类中发生的长时间运行的任务(执行数据库操作)。由于所有工作都是在另一个类中完成的,因此取消并不那么简单。我正在使用另一个类中的一个事件(GenerateStats) 在后台操作完成时更新进度。我想做类似的事情来取消操作。我不能只打电话cancellationPending在 DoWork 函数中,因为该方法在完成之前永远不会看到它,这违背了目的。我想要取消功能而不需要将BackgroundWorker传递给generateForSubject()。无论如何,这可以支持取消吗?generateForSubject()中的方法GenerateStats班级。这是执行操作的类的实例化:

GenerateStats genStats = new GenerateStats();

这是我的 DoWork 函数,它调用ReportProgress每当其他类中的事件被调用时。它还调用其他类的方法generateForSubject()执行操作的。

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    genStats.ProgressChanged += (s, pe) => worker.ReportProgress(pe.ProgressPercentage, pe.UserState);
    genStats.generateForSubject();
}

这是应该启动取消并运行的按钮单击事件处理程序CancelAsync()

private void btnStop_Click(object sender, EventArgs e)
{
    if (backgroundWorker.IsBusy)
    {
        backgroundWorker.CancelAsync();
    }
}

这是我的单独的类,它执行该操作,并创建 ProgressChanged 事件处理程序,以便我的类可以使用进度信息更新表单。如果取消也能实现类似的效果那就太好了。

public event ProgressChangedEventHandler ProgressChanged;

protected virtual void OnProgressChanged(int progress, string message)
{
    if (ProgressChanged != null)
    {
        ProgressChanged(this, new ProgressChangedEventArgs(progress, message));
    }
}

public void generateForSubject()
{
    //Perform db operation not important, but it takes time

    OnProgressChanged(33, "Finished 1st set of stats");
    //I hope to check for cancellation here

    //Perform db operation not important, but it takes time

    OnProgressChanged(66, "Finished 2nd set of stats");
    //I hope to check for cancellation here        

    //Perform db operation not important, but it takes time

    OnProgressChanged(99, "Finished 3rd set of stats");
    //I hope to check for cancellation here
}

只是为了澄清我的要求是否存在任何不确定性,是否有任何方法可以支持在另一个类中取消我的 backgroundWorker 而不将 backgroundWorker 传递给该方法。如果绝对没有办法而且我必须这样做,那么我会通过backgroundWorker


如果您能更具体地说明您不愿意通过考试的情况,将会很有帮助。BackgroundWorker实例。了解为什么这是一个设计要求可以帮助您更好地回答您的问题。

也就是说,您可以应用与ProgressChanged事件并委托取消检查。例如:

class GenerateStats
{
    public event EventHandler<CancelEventArgs> CheckCancel;

    private bool OnCheckCancel()
    {
        EventHandler<CancelEventArgs> handler = CheckCancel;

        if (handler != null)
        {
            CancelEventArgs e = new CancelEventArgs();

            handler(this, e);

            return e.Cancel;
        }

        return false;
    }

    public void generateForSubject()
    {
        //Perform db operation not important, but it takes time

        OnProgressChanged(33, "Finished 1st set of stats");
        if (OnCheckCancel())
        {
            // Or other cancellation logic here
            return;
        }

        //Perform db operation not important, but it takes time

        OnProgressChanged(66, "Finished 2nd set of stats");
        if (OnCheckCancel())
        {
            // Or other cancellation logic here
            return;
        }

        //Perform db operation not important, but it takes time

        OnProgressChanged(99, "Finished 3rd set of stats");
        if (OnCheckCancel())
        {
            // Or other cancellation logic here
            return;
        }
    }
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    genStats.ProgressChanged += (s, pe) => worker.ReportProgress(pe.ProgressPercentage, pe.UserState);
    genStats.CheckCancel += (sender1, e1) => e1.Cancel = worker.CancellationPending;
    genStats.generateForSubject();
}

这允许GenerateStats类来检查待取消的取消,而无需直接访问BackgroundWorker实例,正如ProgressChanged事件允许它通过报告进度BackgroundWorker无需直接访问BackgroundWorker.

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

取消BackgroundWorker 的相关文章

  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • C++中类成员函数相互调用有什么好处?

    我是 C 新手 我发现下面的编程风格对我来说很有趣 我在这里写了一个简化版本 include
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • g++ / gcc 是否支持 C++20 新的atomic_flag 功能?

    根据参考参数 https en cppreference com w cpp atomic atomic flag c 20 有丰富的 对我来说有用的 支持atomic flag运营 然而 目前尚不清楚 gcc 是否支持这些功能 它们在任何
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a

随机推荐

  • A* 用于寻找最短路径并避开障碍物

    我必须获得二维两点之间的 最短 最佳 距离 我必须避免可能连接在一起的线条形状 关于如何表示我可以行驶的节点有什么建议吗 我曾想过制作一个网格 但这听起来不太准确或优雅 如果一条线的任何点位于正方形内 该节点是正方形的中心 我会认为该节点不
  • 使用 BOOST_FUSION_ADAPT_ADT 增强类的融合序列化

    我正在尝试使用 boost fusion 为类获取序列化模块 我已将我的类转换为 boost fusion 序列 此示例取自 Michael Caisse 在 boostcon 13 上演讲的幻灯片 https github com boo
  • MVC 在呈现给用户之前更改响应的最后机会

    我需要在呈现给用户之前更改完整的 html 响应流 使用 html 解析 最后一次机会在哪里 什么时候 恕我直言 在 ASP NET MVC 环境中更改 HTML 响应的更好方法是使用操作过滤器 这是用于压缩输出的动作过滤器的示例 publ
  • 使用 eclipse 从 xsd 生成无头 xml

    在最新版本的免费开源 Eclipse IDE 中 您可以从 DTD 和 XSD 文件生成 XML 文档 右键单击给定的 dtd 或 xsd 文件 然后选择 生成 gt XML 文件 您可以选择要生成哪个根元素以及是否应生成可选属性和元素 我
  • 为什么这不起作用 - Android - onCreate()

    下面的代码不起作用 并抛出NullPointerException引起的RuntimeException public class ListFilteredActivity extends Activity LinearLayout typ
  • 替换网页上链接的方括号

    我正在尝试使用 jQuery Javascript 解析 html 内容 我想查找方括号之间的单词并更改链接的整个单词 Example div This is text inside a div It has a reference to
  • SingleChildScrollView/Column 内的 ReorderableListView

    我需要将可重新排序列表放入 SingleChildScrollView 中 但 ReorderableListView 没有像 ListView 那样的收缩包装 是否有解决方法可以在不使用过时且无人维护的包的情况下完成此布局 虽然 我还没有
  • 在 WinForms 应用程序中显示 XML 文件,具有类似 IE 的着色和折叠节点

    我想在我的 NET 2 0 WinForms 应用程序中显示一个 XML 文件 就像 IE 一样 您可以折叠节点 并且所有内容的颜色都很漂亮 有内置的方法可以做到这一点吗 您可以在应用程序的表单中托管 IE 也可以使用 IE 使用的相同 X
  • 在 PHP 中执行 exec() 或 system() 且不等待输出

    我想从 PHP 脚本中触发 eider exec 或 system 中的 shell 命令 但这是一项需要一段时间才能完成的任务 有没有办法触发它并继续运行 PHP 页面加载而不延迟 编辑 我使用的是 CentOS 6 PHP 5 3 取决
  • 猫头鹰旋转木马无法按 RTL 方向工作

    Owl Carousel 滑块不适用于 RTL 我加rtl true在配置中 但它没有加载滑块 滑块空间在那里并且导航正在显示 但只有滑块内容没有显示 我该如何解决这个问题 我的代码如下 div class row div class it
  • 指定源目录时 Doxygen 找不到文件

    Hello 我尝试使用 doxygen 从一组文件夹生成代码文档 我的文件夹结构是这样的 root include include subdir file h src src subdir file cpp Documentation do
  • UNIX2DOS 功能

    bin ksh c cat PMSourceFileDir RT TgtFiles OutputFileStrPerfHdr PMSourceFileDir RT TgtFiles OutputFileStrPerfCSV unix2dos
  • 预处理器时间戳

    是否可以通过预处理器宏生成嵌入式 Unix 时间戳 例如 define VERSION EXPIRE TIMESTAMP 原因是 我有测试版 我想在编译时生成过期时间戳 在特殊的构建配置中 我已解决如下 define VERSION TIM
  • 为什么 returned() 不接受生成器?

    我正在努力写这样的东西 list reversed list el iterancestors 1 2 3 生成器很糟糕 因为我被迫将它们消耗到列表中 有没有办法简化这个 我认为reversed 应该接受迭代器 我错了吗 生成器不保证有最后
  • javascript 文件中的 Django {% static 'path' %}

    在我的 script js 中 pic src static photos 1 jpg This works pic2 src static photos 1 jpg Does not work 世界上为什么会发生这种事 由于在我的 hom
  • 如何在 C# 中转换纪元时间?

    如何转换 Unix纪元时间 http en wikipedia org wiki Unix time在 C 中变成实时 纪元开始于 1970 年 1 月 1 日 2020 年更新 您可以使用 DateTimeOffset 来做到这一点 Da
  • Pandas - 检查一个数据帧中的字符串列是否包含来自另一个数据帧的一对字符串

    这个问题是基于我问的另一个问题 我没有完全涵盖这个问题 Pandas 检查字符串列是否包含一对字符串 https stackoverflow com questions 43442591 pandas check if a string c
  • 更新每行中的列值,其中该行与同一二维数组中的另一行相同

    我有一个多维数组 如下所示 arr name gt John age gt 10 gender gt male info gt name gt Jeniffer age gt 12 gender gt female info gt name
  • 排除参数化测试类中的非参数测试

    JUnit 中是否有任何注释可以排除参数化测试类中的非参数测试 JUnit 5 从 Junit 5 0 0 开始 您现在可以使用以下方式注释您的测试方法 ParameterizedTest 所以不需要内部类 除了 ValueSource 之
  • 取消BackgroundWorker

    我在 winforms 应用程序中使用 BackgroundWorker 来执行另一个类中发生的长时间运行的任务 执行数据库操作 由于所有工作都是在另一个类中完成的 因此取消并不那么简单 我正在使用另一个类中的一个事件 GenerateSt