我正在做一些套接字编程,最终将进入 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);
}