【发布时间】:2021-02-12 05:25:24
【问题描述】:
我要执行一定数量的方法,第一个以一定值结束的方法必须退出循环。
代码如下所示:
var tasks = new List<Task<bool>>();
tasks.Add(VerificheHandler.RandomString(14));
tasks.Add(VerificheHandler.RandomString(9000));
public bool Test()
{
Parallel.ForEach(tasks, task =>
{
task.Start();
if(task.Result)
{
//exit parallel and kill all
return true;
}
});
}
public async static Task<bool> RandomString(int delay)
{
await Task.Delay(delay);
return true;
}
错误是:
task.Result
Start may not be called on a promise-style task
【问题讨论】:
-
Parallel.Foreach不适合并行运行Tasks。它旨在执行 CPU 绑定操作。 -
and the first method that ends with a certain value什么确定值?在这种情况下是true? -
是的,
async方法总是返回“热”Tasks,你不要对它们调用Start,它们已经开始了。将任务创建与任务执行分开的整个想法通常不是一个好主意。您可能在一组Tasks 上寻找(When/Wait)Any的组合并使用CancellationToken,但您目前的整个问题是涉及错误机制的代码. -
正如 Damien 所说,
Task.WhenAny可能是正确的前进方向。使用列表调用它,如果结果不是您所期望的,则从列表中删除该任务并再次调用它。如果这是您所期望的,请返回。 -
Test方法的预期结果是什么,以防tasks没有一个以特定的true结果完成?
标签: c# async-await parallel-processing task-parallel-library