返回内存(缓存)集合或异步等待响应中的任务

Nul*_*sis 4 c# asp.net async-await

我有一个场景,我的服务类与API通信并填充列表.这个方法是

 public async Task<List<T>> Foo()
Run Code Online (Sandbox Code Playgroud)

在这个方法中,我正在做一个异步等待从API检索数据并反序列化到列表.

问题是,我想做这样的事情:

if (list is cached in memory)
   //serve data from the in memory list
else
   //await get data from the API
Run Code Online (Sandbox Code Playgroud)

但是if语句的第一部分中List<T>的返回类型是第二部分的返回类型Task<List<T>>

我怎样才能做到这一点?我可以将我的内存列表作为任务吗?(也许我可以将List包装在一个任务中)?

谢谢你们!

gre*_*k40 5

我不打算进入技术细节在这里,但想想await作为一个展开Task<T>Tasync包装纸其返回值的方法T进入Task<T>.

所以如果你的方法签名就像你问的那样

public async Task<List<T>> Foo()
Run Code Online (Sandbox Code Playgroud)

那么您的返回值与您的评论不同:

GetDataFromApi(); // results in Task<List<T>>
await GetDataFromApi(); // results in List<T>
Run Code Online (Sandbox Code Playgroud)

所以无论如何,return一个async Task<List<T>>期望的声明,List<T>而不是Task<List<T>>

public async Task<List<T>> Foo()
{
    if (list is cached in memory)
        return list; //serve data from the in memory list
    else
        return await GetDataFromApi(); //await get data from the API
}
Run Code Online (Sandbox Code Playgroud)

如果您不使用async await,则可以将结果包装在已完成的任务中:

public Task<List<T>> Foo()
{
    if (list is cached in memory)
        return Task.FromResult(list); //serve data from the in memory list
    else
        return GetDataFromApi(); //await get data from the API
}
Run Code Online (Sandbox Code Playgroud)

请注意这两个,asyncawait在第二个示例中删除.