最終的にWindowsサービスに入るいくつかのソケットプログラミングを行っています。テスト目的で、コンソール アプリケーションを使用しています。BeginAcceptTcpClient または Task.WaitAll が待機せず、コンソール アプリケーションが終了するだけなので、少し困惑しています。main の最後に Console.ReadLine を追加すると、すべて正常に動作します。メインを少し変更すると、サービスとして実行したときにも機能します。コンソール アプリケーションのすべてのタスクが終了するまで 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);
}