DebuggerStepThrough, DebuggerHidden не работает в методе асинхронного ожидания
Когда вы включаете функцию "Разорвать при возникновении исключения" в отладчике 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);
}
}
Итак, это поведение предназначено? Это ошибка? Есть ли обходной путь?
1 ответ
Атрибуты плохо работают с async/await, так как асинхронные методы переписываются под обложками - и атрибуты не следуют. См. /questions/24737027/contextboundobject-vyidaet-oshibku-udalennogo-vzaimodejstviya-posle-ozhidaniya/24737043#24737043 для аналогичной ситуации.