【发布时间】:2019-02-16 10:07:45
【问题描述】:
我正在编写一个非常简单的 RPC 库,使用 C# 和套接字进行类分配。我的发送功能很好,但我正在测试我的 KillServer 功能是如何工作的。我已经在服务器库中实现了很多线程,我不确定我是否已经找到了取消和软终止线程的正确方法。
我的 StartServerThread 方法:
public void StartServer()
{
ServerThread = new Task(()=>
{
_Socket.Listen(100);
// Enter a loop waiting for connection requests
// Or because I am RDM I don't need connections
while (!_TokenSource.IsCancellationRequested)
{
try
{
var newClient = _Socket.Accept();
_Clients.Add(newClient, ClientThread(newClient));
}
catch (OperationCanceledException)
{
Debug.WriteLine("Canceled");
}
}
foreach (var client in _Clients)
{
client.Key.Disconnect(false);
}
},_TokenSource.Token, TaskCreationOptions.LongRunning);
ServerThread.Start();
}
我的问题是一旦线程到达 _Socket.Accept() 行,它就会被阻塞。因此,即使我在 TokenSource 上调用 Cancel,线程仍然停留在该行并且不会很好地结束。我很难以使用线程并允许连接多个客户端的良好性能的方式设计这个库。
【问题讨论】:
-
你试过非阻塞套接字吗? docs.microsoft.com/en-us/dotnet/api/…
-
您是否尝试过调用 _Socket.Close() ?这完全关闭监听器并释放所有资源
-
看Thread.Interrupt方法和socket的Close方法都解除了clientThread的阻塞
标签: c# multithreading sockets