DebuggerStepThrough,DebuggerHidden不能在async-await方法中工作

DebuggerStepThrough,DebuggerHidden不能在async-await方法中工作

问题描述:

当您打开抛出异常时中断一个在Visual Studio调试器中的功能,它会随处可见的所选异常类型。告诉它不要以特定方法中断的方法是使用修改这些方法> DebuggerStepThrough 属性(或 DebuggerHidden

When you turn on the "Break when an exception is thrown" feature in the Visual Studio debugger it breaks everywhere for selected exception types. The way to tell it not to break in a specific method is to decorate these methods with DebuggerStepThrough attribute (or DebuggerHidden).

这个显然 ,因为某些原因不适用于 async 方法。
这是一个再现问题的片段。即使标记有属性,调试器中断 TestAsync 内部 $ c> test as excepted(它们之间的唯一区别是第一个标有 async 关键字):

This, evidently, doesn't work for an async method for some reason. Here's a snippet that reproduces the issue. The debugger will break inside the TestAsync even though it's marked with the attributes and it will not break inside Test as excepted ( the only difference between them is the first is marked with the async keyword):

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吗有没有解决方法?

So, is this behavior intended? Is it a bug? Is there a workaround?

属性与async / await不兼容,因为异步方法在盖子下重写 - 属性不遵循。有关类似的情况,请参阅 https://*.com/a/22412597/495262

Attributes don't play well with async/await since async methods get re-written under the covers--and the attributes do not follow. See https://*.com/a/22412597/495262 for a similar situation.