我如何为重复进程实现多线程池
本文关键字:进程 实现 多线程 | 更新日期: 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);
}
}