2013-05-03 149 views
1

我想我的foreach函数转换到LINQ功能异步等待在LINQ .TakeWhile

这里是我的正常码[做工精细]

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

    int succeed = 0; 
    foreach (var task in tList) 
    { 
     var result = await task(); 

     if(!result) 
      break; 

     succeed += 1; 
    } 

    MessageBox.Show(succeed == 1 ? "Loading complete." : "Something went wrong!"); 

在这里被转换到LINQ后,[给予2个编译错误]

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

    int succeed = tList.Select(async task => await task()).TakeWhile(result => result).Count(); 

    MessageBox.Show(succeed == 1 ? "Loading complete." : "Something went wrong!"); 

错误

  • 无法转换lambda表达式委托类型“System.Func,布尔>”因为有些 在块中的返回类型不是隐式转换为
    委托返回类型
  • 无法隐式转换型“的System.Threading .Tasks.Task”到‘布尔’

我不知道为什么编译器是给这些消息,所以任何帮助将不胜感激。

注:我也尝试.TakeWhile(async result => await result)与错误

  • 异步方法的返回类型必须为void,任务或工作T

方法1和方法2,如果有人想要它们:

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

回答

0

这很简单,因为由于编译器已经指示,因此无法将Task<bool>转换为bool ..

更改此:

.TakeWhile(result => result) 

..to这样的:

.TakeWhile(result => result.Result) 
+0

但是,当我使用result.Result UI完全冻结?任何想法 ? – 2013-05-03 01:08:37

+0

@RuneS你的UI冻结的原因是因为编译器认为你的方法不是异步的。修正你的代码后,像西蒙建议看看在错误列表窗口中的警告“异步方法缺乏等待” – Raghu 2013-05-03 01:13:13

+0

@Ragzitsu:不正确的抹布,如果我用它等待它说'布尔'不等待... – 2013-05-03 01:15:50

0

有第一和第二代码(不这样做同样的事情)之间的根本区别。

在您正在迭代任务列表的第一个代码上。第二,你只是将每个任务转换成另一个任务 - 异步lambda的返回类型将永远是任务的一部分。

因为你在等待顺序执行每个任务的区域,他们真的按顺序运行。这是你打算做什么?

尝试这样的事情(未测试):

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

int succeed = Task.WaitAll(tList.ToArray()) 
    .TakeWhile(result => result).Count(); 

MessageBox.Show(
    succeed == 1 
    ? "Loading complete." 
    : "Something went wrong!"); 

但是,这仍然是一个陌生的一段代码。

+0

我希望它们按顺序运行。 – 2013-05-03 01:14:30

+0

对不起,但也是这个代码是错误的 – 2013-05-03 01:24:29

+0

这是你在找什么? int succeed = tList.Select(task => task.Result).TakeWhile(result => result).Count(); 或者,可能是这样的: bool succeed = tList.TakeWhile(task => task.Result).Any(); – 2013-05-05 23:54:24