【发布时间】:2020-01-16 12:22:50
【问题描述】:
是否可以从一个方法返回一个任务,该方法首先调用多个Task<T> 返回方法,然后返回包含先前调用结果的某种类型,而不使用await?
例如,下面是直截了当的:
public Task<SomeType> GetAsync() => FirstOrDefaultAsync();
但是,我想做这样的事情:
public Task<SomeType> GetAsync()
{
var list = GetListAsync(); // <-- Task<List<T>>
var count = GetCountAsync(); // <-- Task<int>
return new SomeType // <-- Obviously compiler error
{
List /* <-- List<T> */ = list, // <-- Also compiler error
Count /* <-- int */ = count, // <-- Also compiler error
};
}
有没有可能不用写就可以做到:
public async Task<SomeType> GetAsync()
{
return new Type2
{
List = await GetListAsync(),
Count = await GetCountAsync(),
};
}
【问题讨论】:
-
调用
GetListAsync启动一个任务,返回值会在未来的某个时间产生,当你说await GetListAsync()时,你是在告诉等到收到返回值,所以你期望如何将将来某个时间现在生成的值赋给变量? -
为什么?
async/await的发明是为了使其更具可读性和可管理性。 -
@HenkHolterman 因为我读到有多个 await 对性能不利。我尝试等待最后一次通话
-
@TomVast 我以为你试图避免重构现有的代码库,但那是 wrong reason 这样做。
-
@TomVast - 你听错了。但也许您想将这两个任务与
await WhenAll()重叠,具体取决于您的应用类型。
标签: c# async-await