等待Foreach关键词

Rom*_*key 6 .net c# foreach

我有一个ListTask<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;
}
Run Code Online (Sandbox Code Playgroud)

结果:两个函数都是执行.

问题:我怎么能在里面使用foreach

并提前感谢.

Ree*_*sey 9

你可以await像现在一样在foreach中使用.

结果:两个函数都是执行.

两个函数都应该执行.在返回result之前不会设置为false Method2,此时两者都已经运行.您也可以在两个Task<bool>实例之前启动这两个实例await,因此两者都在(可能)在foreach循环之前运行.

扭转你的方法的顺序,他们将不能同时一定运行(尽管它们可能,因为你开始他们):

var tList = new List<Task<bool>> { Method2(), Method1()};
Run Code Online (Sandbox Code Playgroud)

如果你想完全延迟,你可以把它写成:

var tList = new List<Func<Task<bool>>> { Method2, Method1};

foreach (var taskFunc in tList)
{
    var result = await taskFunc();

    if(!result)
        break;
}
Run Code Online (Sandbox Code Playgroud)

  • 正如我在对这个问题的评论中提到的那样,仅仅因为你没有"等待"特定的任务并不意味着它不会*运行*.问题是这些方法都是在循环之前运行的,所以无论是否等待,它们都会在某个时刻完成(因为显然没有取消.) (2认同)