后台工作者中止

2024-04-20

我最近尝试使用后台工作程序而不是“经典”线程,我意识到至少对我来说,它造成的问题多于解决方案。 我有一个后台工作人员运行同步读取(在本例中是从串行端口)并在 1 行代码中被阻塞大约 30 秒,然后取消挂起不是解决方案。我看到,如果应用程序此时关闭(使用十字按钮和 Application.Exit()),则进程将永远保持僵尸状态。

我需要一种方法来强制中止或终止后台工作线程。


我把一个组合在一起(我认为)可以完成这项工作。如果我不在,请告诉我。 这是一个简单的例子来说明它是如何工作的。

var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};

backgroundWorker.DoWork += (sender, args) =>
         {                 
                 var thisWorker = sender as BackgroundWorker;
                 var _child = new Thread(() =>
                                               {
                                                   //..Do Some Code

                                               });
                 _child .Start();
                 while (_child.IsAlive)
                 {
                     if (thisWorker.CancellationPending)
                     {
                         _child.Abort();
                         args.Cancel = true;
                     }
                     Thread.SpinWait(1);
                 }                 
         };

 backgroundWorker.RunWorkerAsync(parameter);
 //..Do Something...
backgroundWorker.CancelAsync();

由于后台工作程序是线程池的一部分,因此我们不想中止它。但是我们可以在内部运行一个线程,并允许在该线程上发生中止。然后,backgroundWorker 基本上会运行,直到子线程完成或我们向它发出信号以终止进程。然后后台工作线程可以返回到读取池中。通常,我会将其包装在一个帮助程序类中,并传递我希望后台线程运行的委托方法作为参数传入,并在子线程中运行该方法。

如果我用头撞墙,请有人告诉我,但它似乎工作正常。但这就是线程的问题不是吗。当你在不同时间运行它时,你会得到不同的结果。

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

后台工作者中止 的相关文章

随机推荐

  • 符合 Y2K 意味着什么?

    我正在阅读 Perl 编程语言基础知识 我遇到了以下语句 Perl is Y2K compliant 即使在谷歌搜索之后也不太明白它的意思 是否建立了某种标准 如果是的话 那么是谁做的呢 任何信息表示赞赏 对于 20 世纪 90 年代末从事
  • 如何使用 Spring 在 Postgresql 中存储 java.util.ArrayList

    我正在尝试批量插入一组 Bean bean 的属性之一是 ArrayList 批量更新失败 异常 Can t infer the SQL type to use for an instance of java util ArrayList
  • String.Split 不会删除分割文本,仅删除第一个字母

    这里发生了什么 issue CallAction具有以下值 Blah blah WebSite 9 20 2017 Containers remaining changed to 0 对其进行拆分 如下所示 issue CallAction
  • 已弃用对 Google Maps Platform 的无钥匙访问

    有时 当我尝试使用 Google MAPS API KEY 获取 URL 来绘制 折线 时 我的日志中会出现错误 error message Google Maps Platform 的无密钥访问已被弃用 请在所有 API 调用中使用 AP
  • 将 Webpart 添加到页面后,“列表工具”选项卡不再可用

    在 SharePoint 2010 中 我已在列表上方添加了我的 Web 部件 标准列表或文档库列表 这并不重要 此后 列表工具 选项卡不可见 经过一番挖掘后 我发现即使我添加标准 SharePoint WebPart 之一 该问题仍然存在
  • ReactJS Bootstrap 导航栏和路由不能一起工作

    我正在尝试使用 ReactJS 创建一个简单的 Web 应用程序 并且我想使用Navbar由 React Bootstrap 提供 我创建了一个Navigation js包含类的文件Navigation来分离Navbar以及来自的路由App
  • ASP.NET MVC 4 - 从控制器添加捆绑包?

    我的网站上有一些页面使用某些 CSS 和 JS 资源 但它们是唯一使用该 css 或 js 文件的页面 所以我不想在每个页面中都包含该 CSS 和 JS 引用 我认为我可以在控制器中创建一个捆绑包并将其添加到已经注册的捆绑包中 然后将其包含
  • 正则表达式匹配 golang 中不以 www 开头的字符串

    我有以下正则表达式 http www 预期行为 http example com Match http www example com Does not match 看起来像golang不支持负向前瞻 我怎样才能重写这个正则表达式来工作go
  • 正确使用 Servlet 中的 Stateful Bean

    目前 我们有一个注入到 Servlet 中的 Stateful bean 问题是有时我们会得到一个Caused by javax ejb ConcurrentAccessException SessionBean is executing
  • Android 位图调整大小

    调整位图大小的最佳方法是什么 Using options inSampleSize 2 Bitmap bitmap BitmapFactory decodeResource getResources R drawable mandy moo
  • .NET Remoting,为什么列表不能远程处理?

    我在用着RemotingServices Marshal and Activator GetObject在同一台计算机上的两个简单程序之间建立远程通道 public class IpcInterface MarshalByRefObject
  • Spring属性解密

    我们混合了一些尚未迁移到 spring boot 或 spring cloud 的遗留 Spring 应用程序以及 Spring Boot 应用程序 我正在创建一个 Spring 组件 如果属性值已加密且具有前缀 则该组件将在加载环境时自动
  • 如何通过继承向 Pyspark Dataframe 类添加自定义方法

    我正在尝试继承 DataFrame 类并添加其他自定义方法 如下所示 以便我可以流畅地链接并确保所有方法引用相同的数据帧 我收到异常 因为列不可迭代 from pyspark sql dataframe import DataFrame c
  • Crystal Report SP26 SetDataSource() 方法在 Visual Studio 2019 中的客户端计算机中失败

    我正在使用 Visual Studio 2019 和 Crystal Report Service Pack 26 我的代码将数据读取到 ADO NET 数据集中 并将这些数据设置为我的报告的数据源 Visual Basic Net 中类似
  • 如何使用@Configuration排除spring配置文件对其他项目的依赖

    我有一个项目 A In Maven 它依赖于项目 B In Maven 现在项目 B 得到了一些 spring Configuration db 配置 文件 这些文件在我构建和部署项目 A 时启动 但由于我的项目 A 中没有一些配置属性 它
  • AngularJS 如何防止重复的http请求?

    过去的一天我一直在为一些奇怪的情况而苦苦挣扎 发生的情况是 对于远程服务器上的 API 的 http 请求 偶尔会发送重复的请求 任何人都可以提供有关如何避免这些重复请求的帮助吗 这是我在工厂中使用的函数的示例 factory getAll
  • Rails 方式编写复杂查询

    我有这样的疑问 SELECT f id Concat f name REPLACE f parent names AS FullName u name AS Unit u id AS UnitId u position AS UnitPos
  • 如何防止从 char 数组到 bool 的隐式转换

    struct Foo void setBar bool bar bar bar bool bar int main Foo f f setBar true 由于类型转换 上面的代码编译成功 即使传递了一个 char 数组 其中bool是期待
  • 简化 if (x) Some(y) else None?

    这种常见模式感觉有点冗长 if condition Some result else None 我正在考虑使用一个函数来简化 def on A cond Boolean f gt A if cond Some f else None 这将顶
  • 后台工作者中止

    我最近尝试使用后台工作程序而不是 经典 线程 我意识到至少对我来说 它造成的问题多于解决方案 我有一个后台工作人员运行同步读取 在本例中是从串行端口 并在 1 行代码中被阻塞大约 30 秒 然后取消挂起不是解决方案 我看到 如果应用程序此时