我有一个List
Task<bool>
我希望迭代它并根据等待的结果决定是继续还是休息,但具有讽刺意味的是foreach
只是执行任务并等待关键字不起作用
这是我的代码
private async void Execute(object sender, EventArgs e)
{
var tList = new List<Task<bool>> { Method1(), Method2()};
foreach (var task in tList)
{
var result = await task;
if(!result)
break;
}
}
public async Task<bool> Method1()
{
await Task.Delay(1000);
Console.WriteLine("Method1");
return false;
}
public async Task<bool> Method2()
{
await Task.Delay(1000);
Console.WriteLine("Method2");
return true;
}
结果:两个函数都是执行。
问题:我如何在foreach
内使用await?。
提前谢谢。
答案 0 :(得分:9)
您可以在foreach中使用await
,就像现在一样。
结果:两个函数都是执行。
两个函数应该执行。在result
返回之前,Method2
未设置为false,此时两者都已运行。您也在Task<bool>
之前启动了两个await
实例,因此两者都在(可能)在foreach循环之前运行。
颠倒你的方法的顺序,并且它们不会同时运行(虽然它们可能会在你启动它们时):
var tList = new List<Task<bool>> { Method2(), Method1()};
如果你想完全延迟,你可以把它写成:
var tList = new List<Func<Task<bool>>> { Method2, Method1};
foreach (var taskFunc in tList)
{
var result = await taskFunc();
if(!result)
break;
}