繁体   English   中英

从 async/await 方法返回列表

[英]Return list from async/await method

我想异步发出一个网络服务请求。 我在这里称它:

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 方法。 我做错了什么?

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

List<Item> list = await GetListAsync();

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

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

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

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

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

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

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

对我有用:

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

这样就没有必要在调用中用 async 标记方法。

你可以使用以下

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

可以简单地使用“.Result”来获取特定任务的结果,而不是执行所有这些操作。

例如:List list = GetListAsync().Result;

其中根据定义 => 获取此任务的结果值 < TResult >

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM