终止多线程服务器线程c#
本文关键字:线程 服务器 多线程 终止 | 更新日期: 2023-09-27 18:06:55
我有一个启动服务器线程的程序,在该线程中我等待用户连接,但有时(如果用户按"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
,因为它会在没有正确清理线程的情况下终止线程。
要使用取消令牌,您需要创建一个CancellationTokenSource
的实例,然后将令牌传递给线程函数(或传递给包装新线程状态的对象)。在线程函数中,您可以定期检查令牌的IsCancellationRequested
属性,以查看线程是否应该关闭。您可以将相同的取消令牌传递给I/O函数,以便它们尝试取消阻塞操作。
阅读这个问题/答案,了解更多关于Thread.Abort
可能引起的问题的细节。具体读一下Eric Lippert对这个问题的回答,他提到永远不要开始一个你不能礼貌地停止的话题。