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(), но помним о последствиях.
Ссылки¶
Последнее обновление :
9 июля 2023 г.
Дата создания : 1 августа 2022 г.
Дата создания : 1 августа 2022 г.