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吗?有解决办法吗?
属性在async/await中不能很好地发挥作用,因为async方法会在后台被重写——而属性不会跟着重写。参见https://stackoverflow.com/a/22412597/495262了解类似的情况。