gpt4 book ai didi

c# - 立即终止无环线程,无需 Abort 或 Suspend

转载 作者:行者123 更新时间:2023-11-30 20:06:15 27 4
gpt4 key购买 nike

我正在实现一个协议(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)”的一部分。

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

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

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

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

关于c# - 立即终止无环线程,无需 Abort 或 Suspend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9997819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com