1

我正在开发一个客户端-服务器程序。我使用 C# 编程语言和 .net framework 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 个客户端保留对象和变量。这个问题很复杂,但我相信你们所有人都能解决并提出任何建议。真心希望大家给点建议。。。

4

2 回答 2

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;
        }
    }
}
于 2012-08-06T14:03:02.157 回答
1

尝试重构您的代码,以便您拥有一个侦听器线程,该线程在获得连接时会产生客户端线程。这些客户端线程中的每一个都应该能够在适当的时候结束自己。此外,您可能应该将客户端线程的IsBackground属性设置为true,这样它们就不会阻止服务器退出。

你现在这样做的方式也可能是可行的,但似乎比必要的复杂。

于 2012-08-06T14:05:57.370 回答