我正在开发一个客户端 - 服务器程序。我使用C#编程语言和.net框架4.在那里,每当新客户端连接到服务器时,服务器将创建新线程来处理每个客户端。如果其中一个客户端断开连接,则控制此断开连接的客户端的线程也将被停止(终止)。我不知道如何在多个线程中停止这个特定的线程。我的程序的伪代码将是这样的:
服务器端程序:
Thread t;
private void form1_load(object sender, EventArgs e)
{
startserver();
}
void startserver()
{
t = new Thread(waitclientconnection);
t.start();
}
void waitclientconnection()
{
//namedpipeserverconnection code
//waitforclientconnection
if (clientOne is connected)
{
startserver(); //create new thread to wait connection for next client
}
//object and variable that created within the thread
Clientprofile cp = new Clientprofile();
String clientstate = "....";
if (clientOne sends "close" message)
{
//the thread that controls ClientOne will be killed <-- This is the point that I would like to solve
}
}
我承认该程序有点复杂,但目前我只有这种方式来实现我的程序。我找到了一些解决方案,建议声明布尔变量来控制线程停止或使用while循环运行。但是在我的程序中,这种方式可以阻止整个线程,并且无法为新连接的客户端创建新线程。此外,我还想知道当该线程停止时,每个特定线程中创建的变量和对象是否也可以从内存中销毁。想象一下,如果在一小时内连接了100个客户端,目前只有10个客户端连接在一起。我只想在这10个客户端中只保留内存中的对象和变量。问题很复杂,但我相信你们所有人都能够解决并提出任何建议。真的希望你的建议......
答案 0 :(得分:1)
接收关闭消息的线程是应该被“杀死”的线程,对吗?
因此,请确保代码停止并正常返回
不要打电话给Thread.Abort()
或任何会造成混乱的事情。
void waitclientconnection()
{
if (clientOne is connected)
{
startserver(); //create new thread to wait connection for next client
}
while (keepGoing)
{
...
if (clientOne sends "close" message)
{
keepGoing = false;
}
}
}
答案 1 :(得分:1)
尝试重构您的代码,以便您拥有一个侦听器线程,该线程在获取连接时会从客户端线程中生成。每个客户端线程都应该能够在时机成熟时自行结束。此外,您应该将客户端线程的IsBackground
属性设置为true
,这样它们就不会阻止服务器退出。
你现在这样做的方式也可行,但似乎比必要的复杂。