Jam*_*ery 1 c# linq task async-await
在LINQ Select语句中使用匿名方法时,匿名方法是否必须返回值?
当我执行以下操作时,我没有错误:
await Task.WhenAll(list.Select(a => doSomething(a)));
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我得到一个错误,上面写着type arguments cannot be inferred from the usage:
await Task.WhenAll(list.Select(a => {
doSomething(a);
Log("Log Something");
UpdateUI();
}));
Run Code Online (Sandbox Code Playgroud)
为什么第一次工作和第二次工作没有?
这是doSomething方法:
private async Task doSomething(string a)
{
HttpClient client = new HttpClient;
// Do stuff
string source = await client.PostAsync(a, content);
// Extract data from source and store in text file.
}
Run Code Online (Sandbox Code Playgroud)
在LINQ Select语句中使用匿名方法时,匿名方法是否必须返回值?
是.该Select方法的签名是:
public IEnumerable<TResult> Select<TSource, TResult>(
IEnumerable<TSource> source,
Func<TSource, TResult> selector)
Run Code Online (Sandbox Code Playgroud)
所以选择器必须返回一个值.
使用您的第一个代码片段,return语句是隐式的. doSomething返回一个值,该值是每个项目的投影值.
当您使用语句lambda而不是表达式lambda时,没有隐式的return语句.由于您的第二个代码块没有返回任何内容,因此它与Select预期的不匹配.
现在,至于你的实际问题.您要做的是将每个任务投影到执行某项操作的任务中,然后在完成后写入日志并更新UI.您可以使用asynclambda来执行此操作.在async没有return语句的lambda中,它仍将返回a Task(只是没有a Result)而不是void.而这正是您想要做的,将每个任务投射到另一个任务中.
await Task.WhenAll(list.Select(async a => {
await doSomething(a);
Log("Log Something");
UpdateUI();
}));
Run Code Online (Sandbox Code Playgroud)