我正在创建一个接受 TCP 连接的 Windows 服务,处理发送到服务器的数据,然后返回一条消息,说明该过程已完成。有几个客户端将连接到该服务,而且这个数字还在增长。为了处理这些消息,我认为使用非阻塞结构是理想的。从最初的搜索来看,BeginAcceptTcpClient
似乎就是我要找的。我正在寻找 at this tutorial 以获取样本,但我对它的工作原理有一些疑问。我基于这个例子的代码如下。
OnClientConnected
函数中,为什么要再次调用WaitForClients
?为什么听众不总是听? WaitForClients
之前尝试另一个连接会发生什么?我知道这是 OnClientConnected
中的第一个语句,但可能有两个连接“同时”发生 OnClientConnected
,然后调用 WaitForClients
,这将允许处理另一个连接。这似乎是一次一个连接的方法,而不是有多个可以处理大量流量的线程。 public class DeviceListener
{
private TcpListener listener = null;
public DeviceListener()
{
listener = new TcpListener(1001);
}
public void StartListener()
{
listener.Start();
//TODO: Log listening started here
WaitForClients();
}
private void WaitForClients()
{
listener.BeginAcceptTcpClient(OnClientConnected, null);
}
private void OnClientConnected(IAsyncResult asyncResult)
{
WaitForClients();
TcpClient client = listener.EndAcceptTcpClient(asyncResult);
if(client != null)
{
//TODO: Log connected
HandleClientRequest(client);
}
}
private void HandleClientRequest(TcpClient client)
{
//Code to process client request
}
}
最佳答案
BeginAcceptTcpClient
调用一样多的连接,因此为了接受另一个连接,您需要再次调用 BeginAcceptTcpClient
。处理程序的开始似乎是一个合理的地方。 BeginAcceptTcpClient
时排队和处理,或者如果没有及时发生则超时。 ThreadPool
运行。 关于c# - begin/async tcplistener 如何工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46654825/