gpt4 book ai didi

c# - 使用 Task.WhenAll 或不使用 Task.WhenAll

转载 作者:行者123 更新时间:2023-12-05 08:21:59 27 4
gpt4 key购买 nike

我正在审查一些代码并试图找出您应该或不应该使用 Task.WhenAll(Tasks[]) 的技术原因。本质上是并行进行 Http 调用。 Http 调用调用不同的微服务,我猜其中一个调用可能需要一些时间来执行,也可能不需要……(我想我对此并不感兴趣)。我正在使用 BenchmarkDotNet 让我了解是否有更多内存消耗,或者执行时间是否有很大不同。这是一个过度简化的基准示例:

[Benchmark]
public async Task<string> Task_WhenAll_Benchmark()
{
var t1 = Task1();
var t2 = Task2();

await Task.WhenAll(t1, t2);

return $"{t1.Result}===={t2.Result}";
}

[Benchmark]
public async Task<string> Task_KeepItSimple_Benchmark()
{
return $"{await Task1()}===={await Task2()}";
}

Task1Task2方法真的很简单(我在类中有一个静态的HttpClient)

public async Task<string> Task1()
{
using (var request = await httpClient.GetAsync("http://localhost:8000/1.txt"))
{
return $"task{await request.Content.ReadAsStringAsync()}";
}
}

public async Task<string> Task2()
{
using (var request = await httpClient.GetAsync("http://localhost:8000/2.txt"))
{
return $"task{await request.Content.ReadAsStringAsync()}";
}
}

我的结果

<表类="s-表"><头>方法均值错误标准偏差第 0 代第一代第 2 代已分配<正文>Task_WhenAll_Benchmark1.138 毫秒0.0561 毫秒0.1601 毫秒---64 KBTask_KeepItSimple_Benchmark1.461 毫秒0.0822 毫秒0.2331 毫秒---64 KB

如您所见,内存不是问题,执行时间也不多。

我的问题是,是否有技术原因决定您应该或不应该使用 Task.WhenAll()?这只是一种偏好吗?

我遇到了 Async Guidance来自 .net 核心团队的一个人,但它并没有真正涵盖这种情况。

编辑:这是 .net 框架 (4.6.1) 而不是核心!

编辑 2:按照下面评论中的建议更新其中一个基准。

我更新了 KeepItSimple 方法的基准...

[Benchmark]
public async Task<string> Task_KeepItSimple_Benchmark()
{
var t1 = Task1();
var t2 = Task2();

return $"{await t1}===={await t2}";
}

结果如下:

<表类="s-表"><头>方法均值错误标准偏差第 0 代第一代第 2 代已分配<正文>Task_WhenAll_Benchmark1.134 毫秒0.0566 毫秒0.1613 毫秒---64 KBTask_KeepItSimple_Benchmark1.081 毫秒0.0377 毫秒0.1070 毫秒---64 KB

现在我更加困惑了——执行速度如何更快(尽管速度很小!)?我认为代码的执行是在您 await 时开始的结果……

最佳答案

My question really is, is there a technical reason why you should or not use Task.WhenAll()?

在两个调用都失败的异常情况下,行为略有不同。如果它们一次await一个,则永远不会观察到第二个失败;第一次失败的异常会立即传播。如果使用 Task.WhenAll,则会观察到这两种失败;两个任务失败后传播一个异常。

Is it just a preference?

这主要只是偏好。我倾向于更喜欢 WhenAll,因为代码更明确,但我对一次一个 await 没有问题。

关于c# - 使用 Task.WhenAll 或不使用 Task.WhenAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67506865/

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