【发布时间】:2018-03-21 03:46:55
【问题描述】:
我正在创建一个接受 TCP 连接的 Windows 服务,处理发送到服务器的数据,然后返回一条消息,说明该过程已完成。有几个客户端将连接到该服务,并且这个数字正在增长。为了处理这些消息,我认为使用非阻塞结构是理想的。从最初的搜索中,BeginAcceptTcpClient 似乎是我正在寻找的东西。我一直在寻找at this tutorial 来获取样本,但我对它的工作原理有一些疑问。我基于此示例的代码如下。
- 在
OnClientConnected函数中,为什么要再次调用WaitForClients?为什么听者不总是听? - 如果在再次调用
WaitForClients之前尝试另一个连接会发生什么情况?我知道这是OnClientConnected中的第一条语句,但可能有两个连接“同时”发生 - 我无法真正理解这在多线程方面是如何工作的。如果我有 10 个模拟连接,看起来第一个将输入
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
}
}
【问题讨论】:
标签: c# multithreading asynchronous service tcplistener