立即终止无循环线程,无需中止或挂起

2024-03-29

我正在实现一个协议库。这里有一个简化的描述。

main 函数中的主线程将始终检查网络流(在 tcpclient 内)上是否有某些数据可用。假设响应是收到的消息,线程是正在运行的线程。

thread = new Thread(new ThreadStart(function));
thread.IsBackground = true;
thread.Start();

while(true){

response = receiveMessage();

if (response != null)
     {                
      thread.Suspend();
      //I am searching for an alternative for the line above and not thread.Abort().

      thread2 = new Thread(new ThreadStart(function2));
      thread2.IsBackground = true;
      thread2.Start();         
     }
}

到目前为止一切都很好,实际上 while 循环中有更多的消息,并且还有一个状态机用于处理不同类型的传入消息,但这应该足够了。 (不仅仅是函数“function”和“function2”)。

因此,无论如何,在这个应用程序中,函数的内部结构并不清楚,因为协议对程序员是隐藏的,并且意味着是一个库。这意味着协议将根据程序在协议中所处的状态将一些程序员定义的函数作为线程启动。

因此,如果收到特殊响应(例如 callAnotherFunction 消息),我想终止 一个线程(此处称为“线程”)突然出现,假设在 100 毫秒内。但我不知道它是否在循环内执行,以及在终止之前需要多少处理。

如何在不使用已弃用的 Suspend 或 Exception throwing Abort 函数的情况下停止这些线程? (请注意,我不能强迫函数的程序员捕获 ThreadAbortException。)

或者我需要不同的程序架构吗? (顺便说一句,我决定将循环放在 receiveMessage 中,以将网络流轮询到主函数中,因为任何时候都可以出现消息)。


在没有可靠方法终止线程的情况下启动线程是一种不好的做法。挂起/中止是终止线程的不可靠方法之一,因为您可能会在破坏整个程序的状态下终止线程,并且无法避免这种情况发生。

您可以在此处了解如何安全地终止线程:终止 .NET 线程 https://stackoverflow.com/questions/1051838/killing-a-thread-c

如果“用户”为您提供了在线程中运行的方法,那么用户还应该为您提供停止代码运行的方法。将其视为合同:您向用户承诺您将调用 stop 方法,并且他们承诺 stop 方法将实际停止线程。如果您的用户违反了该合同,那么他们将对出现的问题负责,这很好,因为您不想对用户的错误负责:)。

请注意,我不能强迫函数的程序员捕获 ThreadAbortException。

由于挂起/中止是不好的做法,程序员不需要捕获ThreadAbortException,但是他们应该抓住ThreadInterruptedException作为他们“合同”的一部分。

请记住,您需要担心两种情况:

  1. 线程正在执行一些代码。
  2. 线程处于阻塞状态。

在线程正在执行某些代码的情况下,您所能做的就是通知线程它可以退出并等待它处理通知。您也可以跳过等待并假设您已经泄漏了资源,在这种情况下,这又是用户的错,因为他们没有设计他们的 stop 方法来及时终止他们的线程。

如果线程处于阻塞状态并且它没有在通知构造上阻塞(即信号量、手动重置事件等),那么您应该调用Thread.Interrupt()要使其脱离阻塞状态 - 用户必须处理ThreadInterruptedException.

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

立即终止无循环线程,无需中止或挂起 的相关文章

随机推荐

  • C# 闭包堆分配发生在方法开始时

    我似乎遇到了 C 编译器的一些奇怪行为 考虑以下代码示例 static void Main string args Foo false 8 public static void Foo bool execute int x if execu
  • laravel 5.3 当页数 = 1 时的分页

    我有城市表 它有 7 个城市 我有一个视图页面来显示这些城市 每页 10 个城市 控制器 cities City orderBy id desc gt paginate 10 return view cities home compact
  • 在浏览器控制台中使用 Angularjs $http

    我在开发过程中在浏览器控制台中测试了 AngularJS 服务 以进行快速验证 我将服务注入控制台的方式如下所述这个问题 https stackoverflow com a 15529185 605840 or var inj angula
  • 使用字典中的特定键构建列表(python)?

    我正在用 Python 实现 Dijkstra 搜索算法 在搜索结束时 我使用前驱图重建最短路径 从目标节点的前驱开始 例如 path path append destination previous predecessor map des
  • 如何在 Selenium 中的 HTML5 Canvas 上执行鼠标滚轮滚动?

    我正在开发 GWT 应用程序 类似于 Paint 在此 我有一个 HTML5 Canvas 其中有一个功能 向上和向下滚动鼠标滚轮将放大和缩小画布 我进行了很多搜索 但没有找到解决此问题的解决方法 这是所做的 int PosX 0 int
  • 系统('php -l')的替代品?

    在我目前正在从事的一个项目中 我们正在考虑放置system http php net system进入 php ini 的disable functions http php net disable functions宣言 现在 我们的一个
  • SwiftUI - ObservableObject 创建多次

    我在视图中创建了一个 ObservableObject ObservedObject var selectionModel FilterSelectionModel 我在里面放置了一个断点FilterSelectionModel s ini
  • Apache Maven 资源插件排除目录

    我试图在构建过程中将一些资源从一个点复制到另一个点 因此我使用 Apache Maven 资源插件 实际上我排除了一些文件 我不需要 但我还想排除一个目录 我尝试了几种方法但没有成功
  • 使用位置 Azure Data Lake 创建 Databricks SQL 数据库

    如何在 Databricks hive 元存储中使用位置 adls 和 abfss 创建数据库 无需安装 像这样的东西 create database if not exists adb raw location abfss con ema
  • 如何从 Vega Lite 图表中删除轴线

    我想从下面的 vega lite 图表中删除 隐藏轴线 我尝试将颜色更改为空 如下所示 或其他颜色 但这不起作用 https vega github io editor gist fc799bc9f7a8f28b8f1f2ec84673e9
  • android + eclipse + maven + actionbarsherlock

    我读了很多关于 actionbarsherlock maven android 的东西 但我见过的解决方案都不适合我 我确信我已经非常接近解决方案 但我不明白 我需要一些帮助 所以这是我的问题 我尝试创建一个依赖于 Actionbarshe
  • 如何删除空值?

    如何删除底部计数中的空值 即 我只想查看实际销售单位的产品 我尝试过非空和非空但没有成功 with member Measures Amount Sold as Measures Internet Sales Amount format s
  • 为什么“超时”不适用于管道?

    以下命令行调用timeout 这没有意义 只是出于测试原因 无法按预期工作 它会等待 10 秒 并且在 3 秒后不会停止命令的运行 为什么 timeout 3 ls sleep 10 您的命令正在执行的操作正在运行timeout 3 ls并
  • 在 Windows 上的 XAMPP 中哪里可以更改 lower_case_table_names=2 的值?

    我正在使用 Windows 7 和 XAMPP 我正在尝试导出数据库 在此过程中表名称将转换为小写 我搜索了很多 我知道我必须改变的值lower case table names from 0 to 2 但是我必须在哪里更改这个值 在哪个文
  • 将 TypeScript 网站从 GitHub 部署到 Azure

    我有一个 NET 网站 其中包含一些 TypeScript 文件 我尝试将其从 GitHub 部署为 Azure 网站 但收到与 TypeScript 相关的错误 在我看来 这可能与我使用最新版本 1 0 有关 而 kudu 版本只有 0
  • Google 端点和公共 Api 密钥

    要使用 Google 服务 您可以使用 OAuth 身份验证 或者 如果您不需要用户登录 则可以使用公共 api 密钥 将授权域定义为请求的来源 现在 我正在使用 google 端点编写自己的 API 并且我将允许用户通过公共 api 密钥
  • 使用sessionStorage有什么好处? [复制]

    这个问题在这里已经有答案了 只是想知道在存储要在 Javascript 轮播中使用的 HTML 内容时使用 HTML5 的 sessionStorage 的实际好处是什么 与性能有关吗 加载时间 带宽 是的 您将使用更少的带宽 这会提高性能
  • 使用 ggdendro 在树状图的片段下显示变量标签

    我的问题与安德里的有关answer https i stack imgur com JW0m1 png我之前的问题 我的问题是是否可以在树状图的相应段下显示变量标签和汽车标签 library ggplot2 library ggdendro
  • 扩展 Android 的默认 Gmail/电子邮件应用程序

    我想通过插入 ContentProvider 或使用意图过滤器来扩展 Android 平台的默认 Gmail 电子邮件应用程序 本质上 我希望能够扫描传入的电子邮件以查找将在我的 Android 应用程序中触发事件的特殊规则 如果自动扫描电
  • 立即终止无循环线程,无需中止或挂起

    我正在实现一个协议库 这里有一个简化的描述 main 函数中的主线程将始终检查网络流 在 tcpclient 内 上是否有某些数据可用 假设响应是收到的消息 线程是正在运行的线程 thread new Thread new ThreadSt