6

我有一个ListTask<bool>想迭代它,根据等待的结果我决定是继续还是中断,但具有讽刺意味的是,foreach只是执行任务并且 await 关键字不起作用

这是我的代码

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

并提前感谢。

4

1 回答 1

9

您可以await像现在一样在 foreach 中使用。

结果:两个函数都被执行。

这两个函数都应该执行。在返回result之前不会设置为 false Method2,此时两者都已经运行。您也将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;
}
于 2013-05-02T23:53:24.393 回答