我正在实现一个协议库。这里有一个简化的描述。
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
作为他们“合同”的一部分。
请记住,您需要担心两种情况:
- 线程正在执行一些代码。
- 线程处于阻塞状态。
在线程正在执行某些代码的情况下,您所能做的就是通知线程它可以退出并等待它处理通知。您也可以跳过等待并假设您已经泄漏了资源,在这种情况下,这又是用户的错,因为他们没有设计他们的 stop 方法来及时终止他们的线程。
如果线程处于阻塞状态并且它没有在通知构造上阻塞(即信号量、手动重置事件等),那么您应该调用Thread.Interrupt()
要使其脱离阻塞状态 - 用户必须处理ThreadInterruptedException
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)