tes*_*ing 25 c# asynchronous list task async-await
我想异步制作一个Web服务请求.我在这里称呼它:
List<Item> list = GetListAsync();
Run Code Online (Sandbox Code Playgroud)
这是我的函数的声明,它应该返回一个列表:
private async Task<List<Item>> GetListAsync(){
List<Item> list = await Task.Run(() => manager.GetList());
return list;
}
Run Code Online (Sandbox Code Playgroud)
如果我想编译我得到以下错误
Cannot implicitely convert type System.Threading.Tasks.Task<System.Collections.Generic.List<Item>> to System.Collections.Generic.List<Item>
Run Code Online (Sandbox Code Playgroud)
据我所知,如果我使用async修饰符,结果将自动包含在Task中.我认为这不会发生,因为我使用Task.Run.如果我删除了Task.Run(() =>我得到的部分
无法等待System.Collections.Generic.List表达式
我想我还没有完全理解async/await方法.我做错了什么?
tak*_*gen 53
您需要更正代码以等待下载列表:
List<Item> list = await GetListAsync();
Run Code Online (Sandbox Code Playgroud)
此外,请确保此代码所在的方法具有async修饰符.
您收到此错误的原因是该GetListAsync方法返回的Task<T>结果不是完整的结果.由于您的列表是异步下载的(因为Task.Run()),您需要使用await关键字从任务中"提取"值.
如果删除Task.Run(),您的列表将同步下载,您不需要使用Task,async或await.
还有一个建议:GetListAsync如果您所做的唯一事情就是将操作委托给另一个线程,则不需要等待方法,因此您可以将代码缩短为以下内容:
private Task<List<Item>> GetListAsync(){
return Task.Run(() => manager.GetList());
}
Run Code Online (Sandbox Code Playgroud)
Ned*_*nov 10
除了@ takemyoxygen的答案之外,以函数名结尾的约定Async是该函数是真正异步的.即它不会启动新线程,也不会简单地调用Task.Run.如果这是您的函数中的所有代码,最好完全删除它,并且只需:
List<Item> list = await Task.Run(() => manager.GetList());
Run Code Online (Sandbox Code Playgroud)
你可以使用以下内容
private async Task<List<string>> GetItems()
{
return await Task.FromResult(new List<string>
{
"item1", "item2", "item3"
});
}
Run Code Online (Sandbox Code Playgroud)
小智 7
对我有用:
List<Item> list = Task.Run(() => manager.GetList()).Result;
Run Code Online (Sandbox Code Playgroud)
这样就没有必要在调用中用 async 标记方法。