2013-05-02 47 views
5

我有Task<bool>List,我要重复它,这取决于期待已久的结果,我决定是否继续或中断,但具有讽刺意味的foreach刚刚执行的任务和等待关键字不起作用等待里面的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里面等待?

谢谢提前。

+0

'Method1()'返回'true',所以我期待你的循环继续。也就是说,这里有一个基本问题:在启动循环之前,您正在开始执行这两项任务,因此即使第一个任务返回“false”,第二个任务也可能已经完成。你仍然会忽略任何进一步的*结果*,但你不一定会跳过这些结果的计算。 – dlev 2013-05-02 23:49:46

+0

对不起**编辑它**具有相同的结果,并且如果返回false它应该会中断。 – 2013-05-02 23:50:26

回答

9

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

结果:两个函数都执行。

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

正如我在我对这个问题的评论中提到的那样,仅仅因为你不“等待”一个特定的任务并不意味着它不会运行*。问题是这两个方法都是在循环之前运行的,因此无论是否等待,它们都会在某个时间点完成(因为显然没有取消发生。) – dlev 2013-05-02 23:54:17

+0

@dlev非常真实... – 2013-05-02 23:54:48

+0

请参阅文章编辑相同的结果。我想要发生的事情是,如果第一个方法返回false,则不执行第二个方法... – 2013-05-02 23:55:36