从async / await方法返回列表

时间:2014-09-08 09:23:28

标签: c# list asynchronous async-await task

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

List<Item> list = GetListAsync();

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

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

如果我想编译,我会收到以下错误

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

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

  

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

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

5 个答案:

答案 0 :(得分:39)

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

List<Item> list = await GetListAsync();

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

您收到此错误的原因是GetListAsync方法返回的Task<T>不是完整的结果。由于您的列表是异步下载的(因为Task.Run()),您需要提取&#34;提取&#34;使用await关键字的任务中的值。

如果您删除Task.Run(),则会同步下载您的列表,并且您不需要使用Taskasyncawait

还有一个建议:如果您所做的唯一事情就是将操作委托给另一个线程,那么您不需要等待GetListAsync方法,因此您可以将代码缩短为以下内容: / p>

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:0)

为我工作:

List<Item> list = Task.Run(() => manager.GetList()).Result;

这样,就不必在调用中将方法标记为异步。

答案 3 :(得分:0)

您可以使用以下

private async Task<List<string>> GetItems()
{
    return await Task.FromResult(new List<string> 
    { 
      "item1", "item2", "item3" 
    });
}

答案 4 :(得分:-1)

除了执行所有这些操作外,还可以简单地使用“ .Result”从特定任务中获取结果。

例如: 列表清单= GetListAsync()。Result;

按照定义=>获取此Task的结果值