【问题标题】:How to stop specific thread in multithreads and to destroy all variables and objects created in specific thread如何停止多线程中的特定线程并销毁在特定线程中创建的所有变量和对象
【发布时间】:2012-08-06 22:05:57
【问题描述】:

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

【问题讨论】:

    标签: c# multithreading


    【解决方案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;
            }
        }
    }
    

    【讨论】:

    • 真的很有帮助......谢谢你......但它还有一个问题“对象和变量是否能够在这个线程被杀死时从内存中销毁”......再次感谢跨度>
    • 对象将被垃圾收集器根据需要(通常不是尽快)自动“从内存中销毁”,只要它们没有在其他任何地方引用。 See Garbage Collection (MSDN)
    • 不,不能“立即”清除内存。但这不是问题。资源应在using() {} 块中管理。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-28
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多