0

我正在做一些套接字编程,最终将进入 Windows 服务。出于测试目的,我使用控制台应用程序。我有点困惑,因为 BeginAcceptTcpClient 或 Task.WaitAll 没有等待,控制台应用程序刚刚结束。如果我在 main 末尾添加一个 Console.ReadLine ,一切正常。在 Main 中进行了一些细微的修改,当我将它作为服务运行时它也可以工作。为什么 Task.WaitAll 不等到控制台应用程序中的所有任务都完成,为什么 BeginAcceptTcpClient 不停止并等待控制台中的连接,但是当我在服务中运行它时工作正常。

static void Main(string[] args)
        {
            listener = new TcpListener(IP_ADDRESS, Port);
            listener.Start();

            var tasks = new List<Task>();

             Task task = Task.Factory.StartNew(() => AcceptClient(listener),TaskCreationOptions.LongRunning);
                tasks.Add(task);

            Task.WaitAll(tasks.ToArray());

        }


        private static void AcceptClient(TcpListener tcpListener)
        {
            Task<TcpClient> acceptTcpClientTask = Task.Factory.FromAsync<TcpClient>(tcpListener.BeginAcceptTcpClient, tcpListener.EndAcceptTcpClient, tcpListener);

              acceptTcpClientTask.ContinueWith(task => { OnAcceptConnection(task.Result); AcceptClient(tcpListener); }, TaskContinuationOptions.OnlyOnRanToCompletion);
        }
4

1 回答 1

0

这是异步编程的基础。使用 AccesptTcpClient 等待结果。Begin* 函数立即返回。您可以指定结果到达时要调用的回调。

于 2012-10-03T10:33:54.487 回答