gpt4 book ai didi

c# - 如何在不等待的情况下返回 Task

转载 作者:太空宇宙 更新时间:2023-11-03 18:20:28 25 4
gpt4 key购买 nike

是否有可能从一个首先调用多个 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(),
};
}

最佳答案

坦率地说,问题中已有的版本正确:

public async Task<SomeType> GetAsync()
{
return new Type2
{
List = await GetListAsync(),
Count = await GetCountAsync(),
};
}

我知道您问的是“不使用 await”,但是:避免 await 的 hacks 次优;特别是,您应该几乎从不使用ContinueWith - 这是遗留 API,Task 实现现在针对 await< 进行了优化,而不是 ContinueWith

至于:

Because I read that having multiple await is bad for performance. I try to await on last call

没有;一旦您有一个 不完整的 await,您还有多少就无关紧要了 - 它们实际上是免费的。 1 vs 0 不完整 await 的问题与 ContinueWith 相当,因此:避免 await 不会获得任何好处。

结论:只需使用await。它更简单直接,内部结构也针对它进行了优化。

作为一个小的优化,您可能想要添加 ConfigureAwait(false),即

public async Task<SomeType> GetAsync()
{
return new Type2
{
List = await GetListAsync().ConfigureAwait(false),
Count = await GetCountAsync().ConfigureAwait(false),
};
}

或者如果它们应该并发运行,并且实现支持:

public Task<SomeType> GetAsync()
{
var list = GetListAsync();
var count = GetCountAsync();

return new SomeType
{
List = await list.ConfigureAwait(false),
Count = await count.ConfigureAwait(false),
};
}

关于c# - 如何在不等待的情况下返回 Task<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57943718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com