如何在多线程中停止特定线程并销毁在特定线程中创建的所有变量和对象

时间:2012-08-06 13:58:04

标签: c# multithreading

我正在开发一个客户端 - 服务器程序。我使用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个客户端中只保留内存中的对象和变量。问题很复杂,但我相信你们所有人都能够解决并提出任何建议。真的希望你的建议......

2 个答案:

答案 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,这样它们就不会阻止服务器退出。

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