Асинхронная и Visual Studio обработка ошибок

Из MSDN:

Если метод, который изменяет ключевое слово async, не содержит выражения или оператора await, метод выполняется синхронно.

В VSPackage у меня есть 2 команды:

private void FirstMenuCommand(object sender, EventArgs e)
{
    ThrowElevationRequired();
}

private void SecondMenuCommand(object sender, EventArgs e)
{
    ThrowElevationRequiredAsync();
}

Обе эти команды принудительно повышают уровень авторизации:

private void ThrowElevationRequired()
{
    Marshal.ThrowExceptionForHR(unchecked((int)0x800702E4));
}

private async void ThrowElevationRequiredAsync()
{
     Marshal.ThrowExceptionForHR(unchecked((int)0x800702E4));
}

async префикс является единственным отличием для этих методов выше (нет await внутри, просто исключение с конкретным провалом ХРЕСУЛ выкинул) Теперь я знаю, что асинхронная версия не имеет смысла быть здесь, но я хотел бы показать проблему, связанную с этим. А именно, в то время как первая команда вызывает результаты в этом всплывающем окне:

вторая команда, похоже, ничего не делает. Какова причина? (Решарпер показывает async ключевое слово как избыточное, что теоретически верно, но, как показано выше, поведение может сильно отличаться).

1 ответ

Решение

вторая команда, похоже, ничего не делает. Какова причина?

Второй метод является асинхронным, что означает, что исключения никогда не выдаются непосредственно вызывающей стороне - независимо от того, возникает ли исключение во время синхронного выполнения метода или нет. Асинхронный метод, который возвращает Task сделает задачу "сбойной", если метод выдает исключение... но когда асинхронный метод void (что почти никогда не должно иметь место) это называется AsyncVoidMethodBuilder.SetException - поведение которого будет зависеть от контекста синхронизации.

async модификатор определенно не является избыточным в том смысле, что он влияет на поведение, как вы заметили, - и это правильное поведение, работающее как задумано... это просто когда async void Метод выдает исключение, возникает естественный вопрос, что должно его поймать.

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