Исправление: как следует из двух ответов, проблема выглядит специфичной для dart, поскольку C# реализует Task.Wait
, позволяющий достичь желаемого эффекта. Я был бы признателен за любую дополнительную информацию о причинах, по которым это невозможно в дартс или как этого добиться там. Я был бы рад закрыть вопрос в его нынешнем виде.
Бывают ситуации, когда имеет смысл использовать синхронные функции для внутреннего использования асинхронных вызовов, ожидающих их завершения перед доставкой результата. Это явно запрещено как в C#, так и в Dart: все, что использует await
, должно быть помечено как async
(таким образом возвращается будущее).
Простой пример в Dart, но то же самое верно и для C#:
Отказ от ответственности: я бы так не поступил, поэтому не предлагайте "правильное" решение преобразования всех методов в асинхронные; код здесь просто для иллюстрации вопроса.
У меня есть полностью асинхронная реализация универсальной оболочки для HTTP-запросов к определенному REST API. Он выполняет вход, аутентификацию и т. д.:
class RequestProcessor {
Future post(String path, [payload]) async {
return request("POST", path, payload);
}
}
Я хотел бы реализовать высокоуровневый интерфейс API для пользователей, переводящий запросы в REST-API. Некоторые из этих методов я хотел бы иметь синхронными. Это то, что я хотел бы и не могу иметь:
class API {
final RequestProcessor processor;
API(this.processor);
// this takes long and should be asynchronous, happy with a future (OK)
Future getQueryResults(query) async {
return await processor.post("/query", query);
}
// here I would prefer to have it synchronous (COMPILE ERROR)
String getVersion() {
return await processor.post("/version");
}
}
Вопрос. Почему это запрещено?
async
: включает ключевое словоawait
. Возможно, они могли бы обойтись и безasync
, но это вызвало бы двусмысленность. В этой статье объясняются причины этого: блоги .msdn.com/b/ericlippert/archive/2010/11/11/ - person Dennis_E   schedule 26.10.2015Wait()
является пережитком библиотеки параллельной обработки и не должен использоваться в асинхронных задачах. Суть в том, что будущее представляет собой будущий результат. Вы не можете вернуть результат будущего сейчас (т. е. синхронно). - person Stephen Cleary   schedule 26.10.2015Wait()
является распространенной причиной взаимоблокировки. Всегда есть лучшее решение. В 99% случаев лучшее решение — сделать вызывающий код асинхронным. - person Stephen Cleary   schedule 26.10.2015