2015-06-19 76 views
2

我需要做的是這樣的測試()僅僅是計算,我只想把所有的CPU核心在工作中找到解決方案更快。如何實現多線程池一個重複的過程

for (int i= 0; i<1000000; i++) 
{ 
    result[i] = Test(i); 
    if (result[i] == 0) 
    { 
     break; 
    } 
} 

我以前使用過BackgroundWorker。並且可以創建一個N bgWorker數組並自己處理隊列,但看起來太麻煩了。

所以我發現Task.Factory,似乎類似於我想要的東西,但還是不知道如何處理每一個單獨的任務等待結果,發現asnwer時停止一切。

Task<string> task = Task.Factory.StartNew<string> 
        (() => DownloadString("http://www.google.com/")); 
string result = task.Result; 

或者也許有我的問題的其他解決方案。

+0

所以,你想有多個線程照此計算,並停止當其中一個得到答案你期待? – zimdanen

+6

你想['Parallel.For'(https://msdn.microsoft.com/en-us/library/dd460713(V = vs.110)的.aspx) – cubrr

+0

@zimdanen以及我希望每個線程處理相同的功能'測試(i)',當他們完成時選擇下一個可用的'i',直到找到答案。 –

回答

0

你其實並不需要把多內核使用,因爲你正在做的IO限制的工作。

你可以充分利用自然異步API,用於HTTP請求,如由HttpClient曝光。然後,您可以異步地檢查每一個任務,完成OT如果它包含了正確的結果:

public async Task FindResultAsync(string[] urlList) 
{ 
    var downloadTasks = urlList.Select(url => DownloadStringAsync(url)).ToList(); 

    while (downloadTasks.Count > 0) 
    { 
      await finishedTask = Task.WhenAny(downloadTasks) 

      if (finishedTask.Result == someValue) 
      { 
       return finishedTask.Result; 
      } 
      downloadTasks.Remove(finishedTask); 
     } 
}