【问题标题】:DebuggerStepThrough, DebuggerHidden don't work in an async-await methodDebuggerStepThrough、DebuggerHidden 在异步等待方法中不起作用
【发布时间】:2014-08-17 11:19:56
【问题描述】:

当您在 Visual Studio 调试器中打开 "Break when an exception is thrown" 功能时,它会因选定的异常类型而到处中断。告诉它不要中断特定方法的方法是decorate these methods with DebuggerStepThrough attribute (or DebuggerHidden)

这,显然,由于某种原因不适用于async 方法。 这是一个重现该问题的 sn-p。调试器TestAsync内中断,即使它标有属性,并且它不会作为例外情况在Test内中断(它们之间的唯一区别是第一个用async关键字标记):

public class Attributes
{
    public async Task Run()
    {
        await TestAsync();
        await Test();
    }

    [DebuggerHidden]
    [DebuggerStepThrough]
    public async Task TestAsync()
    {
        try
        {
            throw new Exception("Async");
        }
        catch
        {
        }
        await Task.Delay(100);
    }

    [DebuggerHidden]
    [DebuggerStepThrough]
    public Task Test()
    {
        try
        {
            throw new Exception("sync");
        }
        catch
        {
        }
        return Task.Delay(100);
    }
}

那么,这种行为是有意的吗?这是一个错误吗?有解决办法吗?

【问题讨论】:

  • 这是 C# 编译器实现异步方式中一个相当不可避免的缺陷,您的方法被 重写 到隐藏类中。哪个没有获得相同的属性。使用 ildasm.exe 深入了解。
  • @HansPassant 我原本以为只有在使用await(即继续)之后它才起作用,但显然它总是失败。

标签: c# .net debugging exception-handling async-await


【解决方案1】:

属性不能很好地与 async/await 配合使用,因为 async 方法会在底层重写——并且属性不会跟随。类似情况见https://stackoverflow.com/a/22412597/495262

【讨论】:

  • 请注意,DebuggerStepThroughDebuggerHidden 受特定调试器的解释。它们对 CLR 没有特殊意义。它们可能会按照 VS 未来更新中记录的那样工作。
猜你喜欢
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多