我想以异步方式提出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方法。我做错了什么?
答案 0 :(得分:39)
您需要更正代码以等待下载列表:
List<Item> list = await GetListAsync();
此外,请确保此代码所在的方法具有async
修饰符。
您收到此错误的原因是GetListAsync
方法返回的Task<T>
不是完整的结果。由于您的列表是异步下载的(因为Task.Run()
),您需要提取&#34;提取&#34;使用await
关键字的任务中的值。
如果您删除Task.Run()
,则会同步下载您的列表,并且您不需要使用Task
,async
或await
。
还有一个建议:如果您所做的唯一事情就是将操作委托给另一个线程,那么您不需要等待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的结果值