.net 5 与任务(而非线程)的 TCP 连接
TCP connection with Tasks (not Threads) with .net 5
我正在创建一个基于 TCP 连接的小应用程序。为此,我必须创建与我拥有的端口一样多的“侦听器”。
我需要不断地监听新消息,所以我创建了一个包含所有监听器的 for 循环。
public void ListenDataAsync(int[] ports)
{
IPAddress ipAddress = IPAddress.Parse(Constants.host);
/*Create the Clients*/
List<Task> tasks = new List<Task>();
for (var i = 0; i < ports.Length; i++)
{
tcpListeners[i] = new TcpListener(ipAddress, ports[i]);
tcpListeners[i].Start();
var t = Task.Run(() => DoBeginAcceptTcpClient(tcpListeners[i]));
Task.Delay(1000);
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
tasks.Clear();
}
private void DoBeginAcceptTcpClient(TcpListener listener)
{
if (listener != null)
{
// Set the event to nonsignaled state.
tcpClientConnected.Reset();
// Start to listen for connections from a client.
Console.WriteLine("Waiting for a connection...");
// Accept the connection.
listener.Start();
// BeginAcceptSocket() creates the accepted socket.
listener.BeginAcceptTcpClient(
new AsyncCallback(DoAcceptTcpClientCallback),
listener);
// Wait until a connection is made and processed before continuing.
tcpClientConnected.WaitOne();
}
}
在我的例子中,我有两个端口,因此将创建两个侦听器。
对于线程,并发可以正常工作,但是我想使用任务而不是线程。
主要发生的是消息“等待连接”并不总是正确处理。它必须显示两次...有时它会出现一次,none,或两次。
有人知道可能是什么原因吗?
好像跟任务有关...
提前致谢:)
您只需要做:
await Task.Run(() => DoBeginAcceptTcpClient(tcpListeners[i])
我正在创建一个基于 TCP 连接的小应用程序。为此,我必须创建与我拥有的端口一样多的“侦听器”。
我需要不断地监听新消息,所以我创建了一个包含所有监听器的 for 循环。
public void ListenDataAsync(int[] ports)
{
IPAddress ipAddress = IPAddress.Parse(Constants.host);
/*Create the Clients*/
List<Task> tasks = new List<Task>();
for (var i = 0; i < ports.Length; i++)
{
tcpListeners[i] = new TcpListener(ipAddress, ports[i]);
tcpListeners[i].Start();
var t = Task.Run(() => DoBeginAcceptTcpClient(tcpListeners[i]));
Task.Delay(1000);
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
tasks.Clear();
}
private void DoBeginAcceptTcpClient(TcpListener listener)
{
if (listener != null)
{
// Set the event to nonsignaled state.
tcpClientConnected.Reset();
// Start to listen for connections from a client.
Console.WriteLine("Waiting for a connection...");
// Accept the connection.
listener.Start();
// BeginAcceptSocket() creates the accepted socket.
listener.BeginAcceptTcpClient(
new AsyncCallback(DoAcceptTcpClientCallback),
listener);
// Wait until a connection is made and processed before continuing.
tcpClientConnected.WaitOne();
}
}
在我的例子中,我有两个端口,因此将创建两个侦听器。
对于线程,并发可以正常工作,但是我想使用任务而不是线程。
主要发生的是消息“等待连接”并不总是正确处理。它必须显示两次...有时它会出现一次,none,或两次。
有人知道可能是什么原因吗?
好像跟任务有关...
提前致谢:)
您只需要做:
await Task.Run(() => DoBeginAcceptTcpClient(tcpListeners[i])