Visual Studio 分析异步方法,包括实际等待时间

Posted

技术标签:

【中文标题】Visual Studio 分析异步方法,包括实际等待时间【英文标题】:Visual Studio profiling async methods including actual await times 【发布时间】:2014-02-20 14:15:20 【问题描述】:

我们正在尝试分析一些 WCF Web 服务的性能,这些服务大量使用 async/await。

我发现对于 Visual Studio 的 2012 检测分析模式,等待其他异步方法所花费的时间不会累积到其包含的持续时间中。从技术上讲,如果线程实际上不再卡在方法执行中,我想这是有道理的。但这实际上意味着很难深入了解速度较慢的实际方法。

例如,下面的示例主要方法 TestConcurrencyProfiling() 在分析器中显示得非常快,而实际上却陷入等待所有子任务的困境,据报道,这些子任务本身很快但陷入等待。

我确定应该有某种我没有意识到的方法来捕捉这些方法的真正开始时间?

  public async Task<string> TestConcurrencyProfiling()
  
        var numberTasks = new List<Task<int>>();
        var rnd = new Random();
        var counter = 0;

        while (counter < 5)
        
              numberTasks.Add(this.DelayRandomNumber(rnd));
              counter++;
        

        await Task.WhenAll(numberTasks);

        string result = string.Empty;
        foreach (var task in numberTasks)
        
              result += task.Result.ToString() + ";";
        

        return result;
  

  private async Task<int> DelayRandomNumber(Random rnd)
  
        var delay = rnd.Next(1, 4) * 1000;
        await Task.Delay(delay);
        return delay;
  

【问题讨论】:

async 工具仍在迎头赶上。 可能有一种方法可以找到这些数据,但我不一定希望有一种方法。微软团队很可能适合回答这个问题,而且他们不会坚持 SO;请改用MSDN forums。 真的吗?探查器无法在调用者方法中累积等待对象? :-( 这被赋予了一个光荣的名字“CPU Profiling”,这意味着只要线程被阻塞,分析器就会休眠。 I use this method. 【参考方案1】:

据我目前所见,只有 Red Gate 的 ANTS 配置文件支持这种类型的“挂钟”计时。

http://documentation.red-gate.com/display/APP8/Async+in+the+call+tree

【讨论】:

哦,是的!我听说过 redgate 配置文件能够衡量这一点。谢谢提醒。

以上是关于Visual Studio 分析异步方法,包括实际等待时间的主要内容,如果未能解决你的问题,请参考以下文章

恢复 C# 异步方法时,System.Diagnostics.StackTrace 中缺少 Visual Studio 2017 调用堆栈中可见的堆栈帧

在恢复C#异步方法时,System.Diagnostics.StackTrace中缺少Visual Studio 2017调用堆栈中可见的堆栈帧

调试器在 Visual Studio 中的异步 HttpClient.GetAsync() 调用后停止

如何在 Visual Studio 中实际搜索所有文件

Visual Studio 2017更新内容记录

译如何在 Visual Studio 中调试异步代码