Разница в syn c вызове asyn c метода - PullRequest
1 голос
/ 03 марта 2020

У меня есть синхронный код, и я интегрируюсь с библиотекой, которая имеет только асинхронные методы.

Каков наилучший способ вызова асинхронного кода из синхронного кода и почему:

У меня есть два кандидата:

Решение A:

var result = _service.CallAsync().GetAwaiter().GetResult()

Решение B:

Task<string> task = Task.Run<string>(async () => await _service.CallAsync().ConfigureAwait(false));
var result = task.Result

Какой из них лучше и ConfigureAwait(false) в растворе B необходим?

1 Ответ

3 голосов
/ 03 марта 2020

Как А, так и В по своей сути нарушены. Они оба "syn c over aysn c".

Я подозреваю, что B на незначительно меньше сломан, но ... это не рекомендация!


Единственная правильная реализация:

var result = await _service.CallAsync();

или если вам не нужен syn c -context:

var result = await _service.CallAsync().ConfigureAwait(false);

Для полноты: есть несколько незначительных вариантов, которые вы могли бы сделать на основе этого, например, проверка завершения на быстром пути, чтобы избежать накладных расходов конечного автомата на общих путях, но: они в основном все равно будут соответствовать ожиданию асинхронного ожидания / ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...