我正在做一些最终会进入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);
}
答案 0 :(得分:0)
这是异步编程的基础。使用AccesptTcpClient等待结果。 开始*函数立即返回。您可以指定在结果到达时调用的回调。