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

本文关键字:方法 不起作用 async-await DebuggerHidden DebuggerStepThrough | 更新日期: 2023-09-27 18:10:27

当你在Visual Studio调试器中打开"抛出异常时中断"特性时,它会对所选的异常类型在任何地方中断。告诉它不要在特定方法中中断的方法是用DebuggerStepThrough属性(或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);
    }
}

那么,这个行为是有意的吗?是bug吗?有解决办法吗?

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

属性在async/await中不能很好地发挥作用,因为async方法会在后台被重写——而属性不会跟着重写。参见https://stackoverflow.com/a/22412597/495262了解类似的情况。