从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()
,将同步下载列表,您不需要使用Task
, async
或await
。
还有一个建议:如果您只做将操作委托给另一个线程,则不需要等待GetListAsync
方法,因此您可以将代码缩短为以下内容:
private Task> GetListAsync(){ return Task.Run(() => manager.GetList()); }
除了@ takemyoxygen的答案之外,以Async
结尾的函数名称的惯例是该函数是真正异步的。 即它不会启动新线程,也不会简单地调用Task.Run
。 如果这是您的函数中的所有代码,最好将其完全删除,并且只需:
List- list = await Task.Run(() => manager.GetList());