gpt4 book ai didi

c# - 杀死多线程服务器的线程c#

转载 作者:行者123 更新时间:2023-11-30 16:47:22 28 4
gpt4 key购买 nike

我有一个启动服务器线程的程序,在该线程中我等待用户连接,但有时(如果用户按“E”)我想关闭该服务器线程但它不工作。我试过了

'thread'.abort() - but it's freezing and not stopping the thread 

这里是服务器代码:

 private void start()
{
try
{
this.serverSocket = new TcpListener(8888); // creating the Server TCP socket
this.clientSocket = default(TcpClient); // creating the User socket variable

// starting the server
this.serverSocket.Start();

Console.WriteLine("->> server started"); // printing to log

// for always
while (true)
{
counter += 1; // new user
this.clientSocket = this.serverSocket.AcceptTcpClient(); // accepting user
Console.WriteLine(" ->> User connected"); // printing to log
// User creatinon
ConnectedUser user = new ConnectedUser(this.clientSocket);
user.startListerner();
}

this.clientSocket.Close();
this.serverSocket.Stop();
Console.WriteLine(" >> " + "exit");
Console.ReadLine();
}
catch
{
Console.WriteLine("Error launching the Server");
}

}

然后我这样运行它:

this.server = new Thread(start);
server.Start();

我想终止它,我该怎么做?

最佳答案

你必须使用 CancellationTokenSource向您的线程发出终止自身的信号。不推荐使用 Thread.Abort,因为它会终止线程而不会先正确清理。

要使用取消 token ,您需要创建一个 CancellationTokenSource 实例,然后将 token 传递给您的线程函数(或传递给包装新线程状态的对象。在线程函数中,您可以随后定期检查 token 的 IsCancellationRequested 属性以查看线程是否应关闭。您可以将相同的取消 token 传递给 I/O 函数,以便它们尝试取消阻塞操作。

阅读this question/ answers有关 Thread.Abort 可能引起的问题的更多详细信息。具体阅读 Eric Lippert 对这个问题的回答,他提到永远不要开始一个你不能礼貌地停止的话题。

关于c# - 杀死多线程服务器的线程c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39494595/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com