2012-10-03 57 views
0

我正在做一些套接字編程,最終將進入一個Wi​​ndows服務。爲了測試目的,我使用控制檯應用程序。我有點困惑,因爲BeginAcceptTcpClient或Task.WaitAll不會等待,控制檯應用程序剛剛結束。如果我在主結尾處添加Console.ReadLine,則一切正常。在Main中進行一些細微修改時,它也可以在我作爲服務運行時起作用。爲什麼沒有Task.WaitAll等待,直到控制檯應用程序中的所有任務都完成了,爲什麼BeginAcceptTcpClient暫停並等待控制檯中的連接,但是當我在服務中運行它時完美工作。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

這是異步編程的基礎。使用AccesptTcpClient等待結果。 開始*函數立即返回。您可以指定結果到達時要調用的回調。