我需要做类似这样的事情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;
或许我的问题还有其他解决办法。
答案 0 :(得分:4)
Parallel.For(0, 1000000, (i, loopState) =>
{
result[i] = Test(i);
if (result[i] == 0)
{
loopState.Stop();
return;
}
});
答案 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);
}
}