- 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/
C++ 社区目前正在讨论上挂协程与下挂协程。 例如,这个提案中提到了挂起:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4453.p
我刚刚在稳定 channel 上升级了 Flutter,并在尝试启动应用程序(在本地 iOS 模拟器上)时获得了以下 StackTrace。使用 flutter test 运行单元测试也会受到影响。
我想使用插件camera_camera。但是当我尝试编译项目时出现此错误: Flutter:错误:找不到 Getter:“正在暂停”。案例 AppLifecycleState.suspending。
我正在考虑有关 suspend 的事情Arrow 的文档详细解释了:suspend () -> A提供与 IO 相同的保证. 因此,根据文档,只需使用 suspend我们正在将不纯函数转换为纯函数:
Grails应用程序在启动时会以--debug-forked模式挂起。 我正在使用--debug-fork参数运行应用程序,但它会挂起并等待,直到调试器连接到它,然后调试器断开连接,应用程序再次等待调
请考虑以下代码: // program is reading data from an excel file, Sheet1 at cell(0,0). public class Read {
Windows 和 Solaris 线程 API 都允许在“暂停”状态下创建线程。线程仅在稍后“恢复”时才真正开始。我习惯了没有这个概念的 POSIX 线程,我正在努力理解它的动机。谁能建议为什么创建
将方法注释为 @Suspendable 的最佳实践是什么?在 Flow 中,可能有多个查询 vault/compute 业务逻辑的私有(private)方法。这些是否应该用 @Suspendable
有没有办法暂时暂停表单上所有锚定控件的移动或调整大小?即: procedure ScaleFormBy(AForm: TForm; n, d: Integer); begin AForm.Su
我一直在尝试追踪 Jedi VCL 的 JvHidControllerClass.pas 中的内存泄漏,我在源代码历史记录中发现了此更改: 旧版本: constructor TJvHidDeviceR
我正在制作具有过渡-缩放-平移-效果的幻灯片,其性能对于平滑渲染至关重要。这是一个我要移植到Delphi 10.3的旧项目,有一个线程可以在运行渲染到屏幕的同时从jpgeg-images的文件流中加载
我需要在用户继续使用它的同时调试生产服务器。当断点命中时,我希望为其他用户的请求提供服务的其他线程在我检查线程中的变量并决定跳过或进入方法时继续工作。 在 Java 中,当遇到断点时,您可以在“暂停线
大家好我在做秒表。对于暂停,我使用 Thread.suspend() ,对于恢复,我使用 Thread.resume()。但简历并不是恢复工作。代码: pause(){ shouldRun = f
有一个程序在 TCP/IP 端口中监听和应答请求(专有二进制协议(protocol))。但该程序需要更新,因此需要重新启动,然后才能继续在同一端口上执行其工作。 根据其协议(protocol),所有当
这个问题与 Thread.suspend 的替代方案无关。这是关于使用 Thread.suspend 实现偏向锁的可能性,(我相信)不能使用 Thread.interrupt 或类似的替代方案来实现。
所以我已经启动并运行了一台家庭服务器,并使用局域网唤醒对其进行了设置,并且有一位 friend 设法将其从两个州之外的地方唤醒。太棒了,这样我就可以运行文件服务器而无需一直保持开机状态。问题是,唤醒它
有没有办法确定是否已注册指纹但 Touch ID 由于指纹验证失败次数过多而当前处于“暂停”状态? 最佳答案 错误代码可以与 LAError 类进行比较。 func errorMessageForLA
一般问题... 如果我在我的 VBA 代码(基于 Excel)中暂停/退出/中断“For”循环,会有什么危险? 这是我的代码: For i = 1 to Sheets.Count 'check
我有一个 WPF 项目,当我尝试在 RowLoad 事件上运行此代码时,出现以下错误: private void ParentGridView_OnRowLoaded(object sender, E
在我的帐户页面/查看订阅中,在 ACTION 段落中,我有一个 CANCEL 按钮,但没有 SUSPEND 按钮。你知道这是否正常吗? 我跟踪了这个函数,它只返回取消数据:wcs_get_all_
我是一名优秀的程序员,十分优秀!