是否可以从某个方法返回任务,该方法先调用多个Task<T>返回方法,然后返回某种类型,该类型包括先前调用的结果而无需使用await?
例如,以下内容很简单:
public Task<SomeType> GetAsync() => FirstOrDefaultAsync();
Run Code Online (Sandbox Code Playgroud)
但是,我想做这样的事情:
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
};
}
Run Code Online (Sandbox Code Playgroud)
是否可以这样做而无需编写:
public async Task<SomeType> GetAsync()
{
return new Type2
{
List = await GetListAsync(),
Count = await GetCountAsync(),
};
}
Run Code Online (Sandbox Code Playgroud)
坦白说,问题中已经存在的版本是正确的:
public async Task<SomeType> GetAsync()
{
return new Type2
{
List = await GetListAsync(),
Count = await GetCountAsync(),
};
}
Run Code Online (Sandbox Code Playgroud)
我知道您问过“不使用等待”,但是:避免等待的技巧不太理想;特别是,您几乎应该永远不要使用ContinueWith-这是旧版API,并且Task现在针对而await不是优化了实现ContinueWith。
至于:
因为我读到多次等待不利于性能。我试图等待最后一次通话
没有; 一旦您有一个未完成的等待,您拥有多少便无所谓-他们实际上是免费的。一对零残缺的问题await可以与之相提并论ContinueWith,因此:通过避免不获得任何收益await。
结论:只需使用await。它更简单,更直接,并且内部对此进行了优化。
作为次要优化,您可能要添加ConfigureAwait(false),即
public async Task<SomeType> GetAsync()
{
return new Type2
{
List = await GetListAsync().ConfigureAwait(false),
Count = await GetCountAsync().ConfigureAwait(false),
};
}
Run Code Online (Sandbox Code Playgroud)
或者,如果它们应同时运行,并且实现支持它:
public Task<SomeType> GetAsync()
{
var list = GetListAsync();
var count = GetCountAsync();
return new SomeType
{
List = await list.ConfigureAwait(false),
Count = await count.ConfigureAwait(false),
};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |