我如何为重复过程实现多线程池

时间:2015-06-19 21:26:52

标签: c# multithreading

我需要做类似这样的事情Test()只是计算,我只想让所有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;

或许我的问题还有其他解决办法。

2 个答案:

答案 0 :(得分:4)

Parallel.For(0, 1000000, (i, loopState) =>
{
    result[i] = Test(i);
    if (result[i] == 0) 
    {
        loopState.Stop();
        return;
    }
});
  

How to: Write a Simple Parallel.For Loop

     

How to: Stop or Break from a Parallel.For Loop

答案 1 :(得分:0)

由于您正在进行IO绑定工作,因此您实际上不需要使用多个核心。

您可以利用HTTP请求的自然异步API,例如HttpClient公开的API。然后,如果每个任务包含正确的结果,您可以异步检查每个任务:

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);
      }
}