等待Foreach关键词

时间:2013-05-02 23:47:27

标签: c# .net foreach

我有一个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?。

提前谢谢

1 个答案:

答案 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;
}