Одна строчка выстрелить и забыть: void vs. asyn c void + await - PullRequest
2 голосов
/ 15 января 2020

У меня есть обработчик событий void, состоящий ровно из одной строки, которая является вызовом await способного метода.

void Handler( object sender, EventArgs args ) => AwaitableMethod();

Изменение типа возвращаемого значения на Task не вариант Так что это огонь и забывай, неважно, что такое синтактика c сахар. Несмотря на это, Visual Studio помещает зеленый волнистый сигнал в вызов un await ed, предлагая сделать обработчик вызовов async void и await.

async void Handler( object sender, EventArgs args ) => await AwaitableMethod();

Насколько я понимаю, добавление async void и await в этом случае будет просто бесполезным. Visual Studio знает что-то, чего я не знаю, или это просто излишне раздражает?

Ответы [ 2 ]

1 голос
/ 16 января 2020

Насколько я понимаю, добавление asyn c void и await в этом случае будет просто бесполезным.

No.

Если Handler вернул a Task, тогда это будет правдой, и исключение async / await будет в порядке; код без async / await просто вернет Task напрямую, вместо того, чтобы «развернуть» его с помощью await и «обернуть» его обратно в Task с помощью async.

Однако это не тот случай; Handler возвращает void, поэтому код без async / await будет просто игнорировать возвращенный Task, что в большинстве случаев неверно (отсюда и предупреждение компилятора). В частности, игнорирование Task будет игнорировать любые исключения из этого Task. Ваш код также не может знать, когда проигнорированный Task завершен, но, по-видимому, это приемлемо, поскольку ваш обработчик возвращает void.

. Существует "регистрация", в которой методы async void делают это. что фреймворк знает, что задача еще не завершена, поэтому фреймворк знает, когда можно безопасно завершить работу. Единственный. NET предоставленный фреймворк, который на самом деле заботится об этом, это ASP. NET pre-Core; все остальные. NET -обеспечиваемые фреймворки (включая все фреймворки пользовательского интерфейса) игнорируют эту "регистрацию".

0 голосов
/ 15 января 2020

В данном конкретном случае это зависит главным образом от вашей обработки ошибок.

Если AwaitableMethod генерирует асинхронно, то это вызовет поток пользовательского интерфейса во второй версии.

...