- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个协议(protocol)库。这里是一个简化的描述。
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”)。
所以无论如何,在这个应用程序中,函数内部的外观并不清楚,因为协议(protocol)对程序员是隐藏的,并且意味着是一个库。这意味着协议(protocol)将启动一些程序员定义的函数作为线程,具体取决于程序在协议(protocol)中的状态。
因此,如果收到特殊响应(例如 callAnotherFunction 消息),我想终止一个线程(这里命名为“线程”)突然,可以说在 100 毫秒内。但我不知道它是否在循环内执行,也不知道在它终止之前需要多少处理。
如何在不弃用 Suspend 或 Exceptionthrowing Abort 函数的情况下停止这些线程?(请注意,我不能强制函数的程序员捕获 ThreadAbortException。)
或者我需要不同的程序架构吗?(顺便说一句,我决定将循环放在 receiveMessage 中,以便将网络流轮询到主函数中,因为消息随时可能出现)。
最佳答案
在没有可靠的方法终止线程的情况下启动线程是一种不好的做法。 Suspend/Abort 是终止线程的不可靠方法之一,因为您可能会在破坏整个程序的状态下终止线程,并且您无法避免它的发生。
您可以在此处查看如何安全地终止线程:Killing a .NET thread
如果“用户”给你一个在线程中运行的方法,那么用户也应该给你一个停止代码运行的方法。将其视为契约(Contract):您向用户 promise 您将调用 stop 方法,他们 promise stop 方法将实际停止线程。如果您的用户违反了该契约(Contract),那么他们将对出现的问题负责,这很好,因为您不想为用户的错误负责:)。
Note that I cannot force the programmer of the functions to catch the ThreadAbortException.
由于挂起/中止是不好的做法,程序员不需要捕获 ThreadAbortException
,但是他们应该捕获 ThreadInterruptedException
作为他们“契约(Contract)”的一部分。
请记住,您需要担心两种情况:
在线程正在执行某些代码的情况下,您所能做的就是通知线程它可以退出并等待它处理通知。您也可以跳过等待并假设您已经泄漏资源,在这种情况下,这又是用户的错,因为他们没有设计他们的停止方法来及时终止他们的线程。
如果线程处于阻塞状态并且它没有阻塞通知构造(即信号量、手动重置事件等),那么您应该调用 Thread.Interrupt()
来获取它脱离阻塞状态 - 用户必须处理 ThreadInterruptedException
。
关于c# - 立即终止无环线程,无需 Abort 或 Suspend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9997819/
我正在制作简单播放本地视频的应用程序。 一开始我用https://pub.dev/packages/video_player , video_player: ^0.10.2+1 但是由于某种原因,它在
基本上,我有一个 boolean 值,大型 API 项目中大约 20% 的类都使用它。从实用方法到更大的类,一切都使用它。我可以在程序启动时设置状态(不会改变),但不知道访问它的“最佳”方式。 最初,
我正在处理一些广告数据,例如电子邮件数据。我有两个数据集: 邮件级别,针对每个人,说明他们的邮寄日期,以及他们的转换日期。 import pandas as pd df_emailed=pd.Data
例如,我在 A 列中输入了数据,在 B 列中输入了一些复杂的公式作为 A 中数据的函数。A 中的数据行数取决于用户输入。它可以在 2 到 100,000 之间。传统上,我将使用相同的公式填充 B 列的
我正在寻找一种简单的时钟同步协议(protocol),该协议(protocol)易于实现且占用空间小,并且在没有互联网连接的情况下也可以工作,因此可以用于例如在封闭的实验室网络中。需要明确的是,我不是
这是 Objective-J/Cappuccino 的问题,但我添加了 cocoa 标签,因为框架非常相似。 Cappuccino 的缺点之一是 CoreData 尚未移植,因此您必须手动创建所有模型
例如,如果您按退格键,控制台会显示 keyVal 的空字符串,但这会产生误导,因为 keyVal.length 等于 1 还有一个隐藏字符 element.on('keydown',function(
我已经下载了一个主题,我想安装它。现在我位于“外观”>“主题”>“添加”>“新建/上传主题”。WordPress 需要 FTP 访问。好吧,我在本地计算机上,没有 FTP 服务器正在监听端口 21。
所以我认为我疯了,也许我疯了,但这看起来很简单。假设我有这段代码: let a = {}; a.b.c.d.e.f.g = 'Something Awesome'; 现在您可以想象如果检查噩梦就必须进
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
这个问题已经有答案了: How set item checkbox when i click on element span which have this checkbox? (3 个回答) 已关闭
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我已经为下拉菜单编写了一个自定义指令。这些元素绝对定位在相对定位的父元素内,因此我需要获取下拉触发元素的高度,以便将实际菜单移动到其下方。触发器是指令元素的子元素。我想避免使用成熟的 jQuery,而
我需要向端点提交表单,但由于我无法控制 CORS header ,因此无法使用 AJAX 执行此操作。 我目前正在通过渲染隐藏的 iframe 并将提交作为目标来执行此操作。但我仍然无法捕获该事件(我
我的 JSON 输入: { "Key": "Team", "Value": "AA" } { "Key": "Division", "Value": "BB" } 期望的输出: [
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
Pair: BUX/TIX Spread: 113 Rate: 10.159/10.272 High/Low: 115 我想获取值 113 和值 115,但
我正在尝试了解 IPB 论坛的运作方式。 如果我勾选记住我,那么即使我关闭浏览器并重新打开它,我也会保持登录状态。 我正在尝试弄清楚这是如何实现的,因为服务器设置的唯一 cookie 在 sessio
我一直在阅读有关 VIM 的 youcompleteme 插件的内容。然而,问题是我想要一个可以转移到其他开发平台(OpenIndiana、FreeBSD、Linux 和 OS X)上的设置。 使用
我需要找到 Excel 电子表格中的最后一个非空单元格,但我需要它的地址,而不是它的值。 例如:当我想要 K 列中最后一个非空单元格的值时,我使用以下公式: =LOOKUP(2;1/(NOT(ISBL
我是一名优秀的程序员,十分优秀!