![](/img/trans.png)
[英]When will an async await method return from the UI-Thread? At the first await or at the inner 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()
,您的列表将被同步下载,您不需要使用Task
、 async
或await
。
还有一个建议:如果您唯一要做的就是将操作委托给不同的线程,则不需要在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.