DebuggerStepThrough,DebuggerHidden在async-await方法中不起作用

时间:2014-06-26 14:35:12

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

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

由于某些原因,显然async方法不起作用。 这是一个重现问题的片段。调试器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);
    }
}

那么,这种行为是否打算?这是一个错误吗?有解决方法吗?

1 个答案:

答案 0 :(得分:4)

属性不能很好地与async / await一起使用,因为异步方法会在封面下重写 - 并且属性不会跟随。有关类似情况,请参阅https://stackoverflow.com/a/22412597/495262