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 для аналогичной ситуации.

Другие вопросы по тегам