【发布时间】:2012-04-17 09:01:25
【问题描述】:
我正在实现一个协议库。这里是一个简化的描述。
主函数中的主线程将始终检查网络流(在 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 或 Exceptionthrowing Abort 功能的情况下停止这些线程? (请注意,我不能强制函数的程序员捕获 ThreadAbortException。)
或者我需要不同的程序架构吗? (顺便说一句,我决定将循环放在 receiveMessage 中,用于将网络流轮询到 main 函数中,因为任何时候都会出现消息)。
【问题讨论】:
-
我们是否遗漏了什么?将 while(true), 更改为 while(keepLooping),然后在循环内部,如果您检测到您没有将其设置为 false,线程会优雅地完成????
标签: c# multithreading tcpclient terminate suspend