我想知道GetDataFromLongRunningOp
返回的结果中是否至少有一个符合某个条件:
foreach (var item in list)
{
var result = GetDataFromLongRunningOp(item);
if (CheckCondition(result))
{
return true;
}
}
return false;
如何为每个项目并行调用GetDataFromLongRunningOp
,以减少找到答案所需的总时间?
修改:GetDataFromLongRunningOp
是一种异步方法。
答案 0 :(得分:2)
使用GetDataFromLongRunningOp
异步运行Task.Run
。使用TaskCompletionSource
,当返回满足条件的结果时,将返回已完成的任务。如果没有结果符合条件,那么tcs.Task
将永远不会完成。您需要另一个等待完成所有任务的任务。因此,最后,您需要等待tcs.Task
或Task.WhenAll
完成。
var result = false;
var tasks = new List<Task>();
var tcs = new TaskCompletionSource<bool>();
foreach (var item in list)
{
var task = Task.Run(() => GetDataFromLongRunningOp(item))
.ContinueWith(t =>
{
if (CheckCondition(t.Result))
{
result = true;
tcs.TrySetResult(true);
}
});
tasks.Add(task);
}
await Task.WhenAny(tcs.Task, Task.WhenAll(tasks));
return result;
答案 1 :(得分:1)
假设您的工作是CPU绑定而非IO绑定,您可以查看Parallel.ForEach
:
Parallel.ForEach(list, (item) =>
{
var result = GetDataFromLongRunningOp(item);
if (CheckCondition(result))
{
return true;
}
});
return false;
请注意,您必须确保GetDataFromLongRunningOp
是线程安全的,当然,基准您的代码,以确保并行运行并不会超过成本。< / p>