如何不等待就返回Task <T>

Tom*_*ast 1 c# async-await

是否可以从某个方法返回任务,该方法先调用多个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)

Mar*_*ell 7

坦白说,问题中已经存在的版本是正确的

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)