停止线程从另一个线程c#

时间:2017-03-20 09:05:35

标签: c# multithreading

我目前正在以c#形式制作客户端/服务器应用程序。该窗口具有日志(文本区域),命令行(文本区域)和一个按钮。我在运行时关闭服务器(另一个线程)时遇到问题。

    void Server_Thread_Main(object arg)
    {
        TcpClient client;
        Output.Insert_to_LOG_Window("Server initialized at IP: " + IP_ADDR + ":" + PORT);
        while (true)
        {
            client = listener.AcceptTcpClient();
            clients.Add(new C_Client(client, Output, client_ID_iter++));

            clients[clients.Count - 1].Start();
        }




    }

我也有用于处理命令行输入命令的类。它叫做Task_Menager。每个命令都由新线程处理。对于proccesing命令,它具有此功能

    void Server_Task_CMD(optargs args)
    {
        bool if_start = false;

        foreach(argument arg in args)
        {
            switch (arg.Option)
            {
                case "-stop":
                    Output.server.Stop_Server(); //<- stopping server
                    break;
                case "-start":
                    if_start = true;
                    break;
                case "-IP":
                    Output.server.Set_Server_IP(arg.Value);
                    break;
                case "-PORT":
                    Output.server.Set_Server_PORT(arg.Value);
                    break;
                case "-IPP":
                    if (arg.Value.Contains(':') == true)
                        Output.server.Set_Server_Params(arg.Value);
                    else
                        Output.Insert_to_COMMAND_Log("This " + arg.Value + " isn't valid IP:PORT notation!");
                    break;
                case "-V":
                case "-VIEW":
                    Output.server.Display_IP_PORT();
                    break;
                default:
                    Output.Insert_to_COMMAND_Log("Not known command: " + arg.Option + " !");
                    break;



            }
            if(if_start==true)
                Output.server.Initialize_Server();

        }
    }

并且此功能是

    public void Stop_Server()
    {
        if (server_thread.IsAlive == true)
        {
            Output.Insert_to_LOG_Window("Stopping server...");
            server_thread.Interrupt();
            if (!server_thread.Join(2000))
            {
                server_thread.Abort();
            }
            Output.Insert_to_COMMAND_Log("Server has been stopped!!!");
        }
        else
            Output.Insert_to_LOG_Window("Server isn't running right now!");



    }

问题是我不知道为什么服务器线程没有停止。

1 个答案:

答案 0 :(得分:0)

这不是关闭线程的正确方法。目前你的帖子可能卡在listener.AcceptTcpClient

您应首先使用listener.Stop();关闭听众 其次,你必须关闭所有客户端套接字 第三,除非绝对别无其他办法,否则你不应该致电thread.Abort

所以你的Stop_Server应该更像这样:

public void Stop_Server()
{
    listener.Stop();
    server_thread.Join();
    Output.Insert_to_COMMAND_Log("Server has been stopped!!!");
}

在你的线程方法中,用while (true)

包裹try-catch(SocketException)

了解详情here