我想我的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