我想我的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;
}
但是,当我使用result.Result UI完全冻结?任何想法 ? – 2013-05-03 01:08:37
@RuneS你的UI冻结的原因是因为编译器认为你的方法不是异步的。修正你的代码后,像西蒙建议看看在错误列表窗口中的警告“异步方法缺乏等待” – Raghu 2013-05-03 01:13:13
@Ragzitsu:不正确的抹布,如果我用它等待它说'布尔'不等待... – 2013-05-03 01:15:50