从async/await方法返回列表

tes*_*ing 25 c# asynchronous list task async-await

我想异步制作一个Web服务请求.我在这里称呼它:

List<Item> list = GetListAsync();
Run Code Online (Sandbox Code Playgroud)

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

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

如果我想编译我得到以下错误

Cannot implicitely convert type System.Threading.Tasks.Task<System.Collections.Generic.List<Item>> to System.Collections.Generic.List<Item>
Run Code Online (Sandbox Code Playgroud)

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

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

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

tak*_*gen 53

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

List<Item> list = await GetListAsync();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


Ned*_*nov 10

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

List<Item> list = await Task.Run(() => manager.GetList());
Run Code Online (Sandbox Code Playgroud)


Llo*_*oyd 9

你可以使用以下内容

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


小智 7

对我有用:

List<Item> list = Task.Run(() => manager.GetList()).Result;
Run Code Online (Sandbox Code Playgroud)

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