【问题标题】:Await Inside Foreach Keyword在 Foreach 关键字中等待
【发布时间】:2013-05-02 23:47:27
【问题描述】:

我有一个 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 中使用 await ?。

提前感谢

【问题讨论】:

  • Method1() 返回true,所以我希望你的循环继续。也就是说,您在这里有一个基本问题:您在开始循环之前启动了两个任务,因此即使第一个任务返回false,第二个任务也可能已经完成。您仍然会忽略任何进一步的结果,但不一定会跳过这些结果的计算。
  • 抱歉编辑了结果相同,如果返回 false 应该会中断。

标签: c# .net foreach


【解决方案1】:

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

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

两个函数都应该执行。在Method2 返回之前,result 不会设置为 false,此时两者都已经运行。您还将在 await 之前启动两个 Task&lt;bool&gt; 实例,因此两者都(可能)在您的 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;
}

【讨论】:

  • 正如我在对该问题的评论中提到的,仅仅因为您不await 某项任务并不意味着它不会运行。问题是这些方法都在循环之前运行,所以无论是否等待,它们都会在某个时候完成(因为显然没有发生取消。)
  • 查看具有相同结果的帖子编辑。我想要发生的是,如果第一个方法返回 false 不执行第二个......
  • @RuneS 查看我的编辑 - 第二个会导致它按照你的意愿行事,因为我不会在你进入循环之前开始任务......
  • 干得好。非常感谢@ReedCopsey
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 2014-11-23
  • 2018-02-12
  • 2019-06-29
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多