BenchmarkDotNet GlobalSetup 无法正确处理异步

问题描述 投票:0回答:1

我有一个基准类,其代码类似于以下内容:

[GlobalSetup]
public async Task Setup()
{
    await Task.Delay(1000 * 10);

    Console.WriteLine("Got here...");
}

[Benchmark]
public async Task Benchmark()
{
   await OtherCode();
}

当我运行此命令时,OtherCode 在 GlobalSetup 完全完成之前运行。这是 BenchmarkDotNet 中的错误,还是我可能做错了什么?

我尝试过在线搜索,但大多数结果都带来了同样的几篇文章,但没有任何有用的信息。

编辑:

https://github.com/dotnet/BenchmarkDotNet/issues/1738

此链接显示了类似的问题,但看起来并没有得到解决。有没有人处理过类似的问题,如果有,你的解决方法/解决方案是什么?

编辑2:

通过我的具体设置,我能够让它工作,尽管它看起来确实有点老套。我在 GlobalSetup 中的代码是预先计算并存储在静态字段中的。然后我在基准类中引用了它。

还需要注意的是,我正在从 xunit 测试运行我的基准测试类,并在运行程序的作业配置中使用 InProcessEmitToolchain。

话虽这么说,我仍然很好奇为什么 GlobalSetup 没有得到正确的等待。这是正在修复的作品中,还是有意为之?

c# .net asynchronous benchmarkdotnet
1个回答
0
投票

https://github.com/dotnet/BenchmarkDotNet/issues/1738#issuecomment-1687832731

根据这个问题,有一个拉取请求来解决这个问题,尽管它已经处于开放状态相当长一段时间了。正如拉取请求的作者提到的,临时解决方案是在 GlobalSetup 中同步等待结果

task.GetAwaiter().GetResult()
。我相信这比我原来的解决方案更有意义,因为它将您的逻辑保留在基准测试本身内,而不是通过静态包装器注入它。

© www.soinside.com 2019 - 2024. All rights reserved.