0

最終的に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);
        }
4

1 に答える 1

0

これが非同期プログラミングの基本です。AccesptTcpClient を使用して結果を待ちます。Begin* 関数はすぐに戻ります。結果が到着したときに呼び出されるコールバックを指定できます。

于 2012-10-03T10:33:54.487 に答える