从async / await方法返回列表

我想以异步方式提出Web服务请求。 我在这里称呼它:

List list = GetListAsync(); 

这是我的函数的声明,它应该返回一个列表:

 private async Task<List> GetListAsync(){ List list = await Task.Run(() => manager.GetList()); return list; } 

如果我想编译我得到以下错误

 Cannot implicitely convert type System.Threading.Tasks.Task<System.Collections.Generic.List> to System.Collections.Generic.List 

据我所知,如果我使用async修饰符,结果会自动包含在Task中。 我认为这不会发生,因为我使用Task.Run 。 如果我删除Task.Run(() =>部分我得到

无法等待System.Collections.Generic.List表达式

我想我还没有完全理解async / await方法。 我做错了什么?

您需要更正代码以等待列表下载:

 List list = await GetListAsync(); 

此外,请确保此代码所在的方法具有async修饰符。

您收到此错误的原因是GetListAsync方法返回的Task不是完成的结果。 由于您的列表是异步下载的(因为Task.Run() ),您需要使用await关键字从任务中“提取”该值。

如果删除Task.Run() ,将同步下载列表,您不需要使用Taskasyncawait

还有一个建议:如果您只做将操作委托给另一个线程,则不需要等待GetListAsync方法,因此您可以将代码缩短为以下内容:

 private Task> GetListAsync(){ return Task.Run(() => manager.GetList()); } 

除了@ takemyoxygen的答案之外,以Async结尾的函数名称的惯例是该函数是真正异步的。 即它不会启动新线程,也不会简单地调用Task.Run 。 如果这是您的函数中的所有代码,最好将其完全删除,并且只需:

 List list = await Task.Run(() => manager.GetList());