BeginAcceptTcpClient没有等待

时间:2012-10-03 10:29:08

标签: c# multithreading sockets

我正在做一些最终会进入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);
        }

1 个答案:

答案 0 :(得分:0)

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