Подтвердить что ты не робот

DebuggerStepThrough, DebuggerHidden не работают в методе async-ожидания

Когда вы включаете "Перерыв при вызове исключения" в отладчике 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);
    }
}

Итак, такое поведение предназначено? Это ошибка? Есть ли способ обхода?

4b9b3361

Ответ 1

Атрибуты не хорошо работают с async/await, так как методы async переписываются под обложками - и атрибуты не следуют. См. fooobar.com/info/67299/... для аналогичной ситуации.