.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])