2017-05-20 79 views
-1

我希望能夠知道線程或等待回調何時先完成,然後再執行代碼。這是我當前的代碼:在執行其餘代碼之前等待ThreadPool完全完成? C#.NET

foreach (var ip in iPAddresses) 
      { 
       string loopIp = ip; 

       WaitCallback func = delegate (object state) 
       { 
        if (PingHost(loopIp, portNumber)) 
        { 
         Console.WriteLine("IP Found at: " + loopIp + ":" + portNumber); 
         IPAddressesAndPortNumbersList.Add(loopIp, portNumber); 
        } 

       }; 

       ThreadPool.QueueUserWorkItem(func); 

       //I want the below to be executed after the thread has finished completely 
       Console.WriteLine("I have finished..."); 
      } 

解決方案:據我所知,你可以使用一個普通螺紋牙並執行此功能,但是,我做的工作,這將是這樣慢做到這一點。我發現這是在waitcallback函數中完成要求工作的最快方法。

+1

爲什麼不使用'Task.Run'?這是開始使用ThreadPool的現代方式。 –

+0

我試過了,等着慢我的任務 – Khan

+0

你根本不需要任何線程,只是一個正確寫好的可以等待的PingHost() –

回答

0

我認爲你需要Task.WaitAll或Task.WhenAll。這裏有一些例子:

Task.WaitAll以及它的重載,當你想要並行執行一些任務(並且沒有返回值)時。當你想要做一些任務,返回值

var tasks = new[] 
{ 
    Task.Factory.StartNew(() => DoSomething1()), 
    Task.Factory.StartNew(() => DoSomething2()), 
    Task.Factory.StartNew(() => DoSomething3()) 
};  
Task.WaitAll(tasks); 

Task.WhenAll,它執行的操作,並把結果在一個數組。它是線程安全的,您不需要使用線程安全的容器並自己實現添加操作。

var tasks = new[] 
{ 
    Task.Factory.StartNew(() => GetSomething1()), 
    Task.Factory.StartNew(() => GetSomething2()), 
    Task.Factory.StartNew(() => GetSomething3()) 
};  
var things = Task.WhenAll(tasks); 
+0

謝謝,我已經試過了,但它仍然很慢。 – Khan

相關問題