Перейти к содержанию

async void

Не должен использоваться где-либо, кроме (если очень нужно) обработчика события (event).
Основная причина — неловленное в этом методе исключение распространится на весь контекст синхронизации, что обычно приводит к падению всего приложения (если обернуть вызов метода в try/catch, исключение НЕ ПОЙМАЕТСЯ).
Если в методе нельзя возвратить Task (например, при реализации чужого интерфейса), необходимо перенести асинхронный код в другой метод и вызвать его оттуда, например

interface IInterface
{
    void DoSomething();
}

class Implementation : IInterface
{
    public void DoSomething()
    {
        // переносим асинхронный код в другой метод
        _ = DoSomethingAsync();
    }

    private async Task DoSomethingAsync()
    {
        await Task.Delay(100);
    }
}

Нюанс

этот код не будет дожидаться выполнения DoSomethingAsync()
Если нужно всё-таки дождаться выполнения, то тут всё-таки можно использовать GetAwaiter().GetResult(), но помним о последствиях.

Ссылки

https://docs.microsoft.com/ru-ru/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming


Последнее обновление : 9 июля 2023 г.
Дата создания : 1 августа 2022 г.

Комментарии

Комментарии