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.