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

本文关键字:进程 实现 多线程 | 更新日期: 2023-09-27 17:57:07

我需要做这样的事情 Test() 只是计算,我只想将所有 cpu 内核投入工作以更快地找到解决方案。

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

我以前与BackgroundWorkers合作过。并且可以创建一个 N bgWorker 数组并自己处理队列,但看起来太麻烦了。

所以我找到了 Task.Factory,看起来与我想要的相似,但仍然不知道如何处理每个单独的任务以等待结果并在找到 asnwer 时停止所有内容。

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

或者也许还有其他解决方案可以解决我的问题。

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

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

如何:编写一个简单的 parallel.for 循环

如何:从并行中停止或中断。For 循环

实际上,

您不需要使用多个内核,因为您正在执行 IO 绑定工作。

您可以利用 HTTP 请求的自然异步 API,例如 HttpClient 公开的 API。然后,您可以在 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);
      }
}