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(). Кроме того, что он очень сложный, он не асинхронен и может привести к взаимоблокировкам.