【发布时间】:2014-08-17 11:19:56
【问题描述】:
当您在 Visual Studio 调试器中打开 "Break when an exception is thrown" 功能时,它会因选定的异常类型而到处中断。告诉它不要中断特定方法的方法是decorate these methods with DebuggerStepThrough attribute (or DebuggerHidden)。
这,显然,由于某种原因不适用于async 方法。
这是一个重现该问题的 sn-p。调试器将在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);
}
}
那么,这种行为是有意的吗?这是一个错误吗?有解决办法吗?
【问题讨论】:
-
这是 C# 编译器实现异步方式中一个相当不可避免的缺陷,您的方法被 重写 到隐藏类中。哪个没有获得相同的属性。使用 ildasm.exe 深入了解。
-
@HansPassant 我原本以为只有在使用await(即继续)之后它才起作用,但显然它总是失败。
标签: c# .net debugging exception-handling async-await