Async ждет и GetAwaiter(). GetResult() и обратный вызов
Я пытаюсь найти наилучшую практику для одного из моих проектов. Это типичное приложение WPF с пользовательским интерфейсом, который отображает список элементов, и есть служба данных, которая возвращает результат.
Мы вызываем службу асинхронно, чтобы не блокировать пользовательский интерфейс. У нас есть 2 варианта:
-
Использование ключевых слов Async для ожидания
Это требует маркировки всех методов Async от кнопки до щелчка до уровня сервиса (класс на стороне клиента, который делает HTTP-вызов на сервере), и любой метод между ними. Этот подход работает отлично, а затем проблема распространения async везде
-
Использовать awaiter и callback
В этом подходе клиент UI вызывает сервисный уровень и передает обратный вызов на уровень обслуживания, уровень сервиса обертывает вызов HTTP серверу в задаче и использует GetAwaiter(). GetResult(), когда HTTP-вызов завершен, он вызывает обратный вызов, передаваемый клиентом пользовательского интерфейса. В этом случае ни один метод не должен отмечать async, но не совсем уверен в использовании GetAwaiter()
Task.Run(async() = > //ждет HTTP-вызов, вызывает обратный вызов).GetAwaiter(). GetResult();
Я просто пытаюсь выяснить, какой из них лучше, и если есть какие-то проблемы с любым из них, я должен знать
Ответы
Ответ 1
Вы должны использовать ключевые слова async
и await
полностью, или вы не должны использовать async вообще.
Второй вариант не является асинхронным. Он вызывает асинхронную операцию и блокирует ее синхронно с task.GetAwaiter().GetResult()
.
Кроме того, что он очень сложный, он не асинхронен и может привести к взаимоблокировкам.