C# BeginAcceptTcpClient未等待

C# BeginAcceptTcpClient未等待,c#,multithreading,sockets,C#,Multithreading,Sockets,我正在做一些套接字编程,最终将进入windows服务。出于测试目的,im使用控制台应用程序。我有点困惑,因为BeginAcceptTcpClient或Task.WaitAll不等待,控制台应用程序刚刚结束。如果我在main的末尾添加一个Console.ReadLine,一切正常。在Main中稍作修改后,当我将其作为服务运行时,它也可以工作。为什么Task.WaitAll不等待控制台应用程序中的所有任务完成,为什么BeginAcceptTcpClient不在控制台中暂停并等待连接,但在服务中运行它

我正在做一些套接字编程,最终将进入windows服务。出于测试目的,im使用控制台应用程序。我有点困惑,因为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);
        }
static void Main(字符串[]args)
{
侦听器=新的TcpListener(IP_地址,端口);
listener.Start();
var tasks=新列表();
Task Task=Task.Factory.StartNew(()=>AcceptClient(listener),TaskCreationOptions.LongRunning);
任务。添加(任务);
Task.WaitAll(tasks.ToArray());
}
专用静态无效接受客户端(TcpListener TcpListener)
{
Task acceptTcpClientTask=Task.Factory.fromsync(tcpListener.BeginAcceptTcpClient,tcpListener.EndAcceptTcpClient,tcpListener);
AcceptCpclientTask.ContinueWith(task=>{OnAcceptConnection(task.Result);AcceptClient(tcpListener);},TaskContinuationOptions.OnlyOnRanToCompletion);
}

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