Самый простой способ быть асинхронным (использовать await) в Startup.cs?веб-приложение API - PullRequest
0 голосов
/ 03 июля 2019

Мне бы хотелось, чтобы с момента запуска моего веб-API-приложения (Program.cs и Startup.cs) был простой способ асинхронизации

Это просто плохой способ делать вещи? Я не могу найти легкий путь. Я бы хотел быть асинхронным до конца, разве это не легко?

Другими словами, я хотел бы использовать «await» в файле Startup.cs.

Startup.cs является частью шаблона по умолчанию, поэтому я не привык его заменять, но, возможно, есть другой способ сделать это "асинхронно".

Основная необходимость здесь заключается в том, чтобы я мог вызывать KeyVault (GetSecretAsync) во время моей логики Startup.cs и избежать проблем с тупиковыми потоками.

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Все, что вам нужно сделать, - это файл csproj, установите LangVersion на 7.1.Вы также можете использовать Latest, если хотите.

<PropertyGroup>
  <LangVersion>7.1</LangVersion>
</PropertyGroup>

Тогда вы делаете свой метод Main асинхронным

static async Task Main(string[] args) {
  //some async code goes here
}
2 голосов
/ 03 июля 2019

Не совсем понятно, что вы имеете в виду, но ASP.NET Core по своей сути асинхронен (по умолчанию он создает пул потоков с несколькими потоками.) Если вы хотите, чтобы ваши отдельные методы API были асинхронными, вам просто нужно закодируйте их таким образом. Класс MVC ControllerBase поддерживает асинхронные методы действия, поэтому все, что вам нужно сделать, это вернуть Task<IActionResult> вместо IActionResult из ваших методов действия. В Program.cs или Startup.cs нечего менять, чтобы включить эту функцию.

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

Если вы хотите что-то сделать в классах Program или Startup, которые вы хотите распараллелить, то вы будете делать это с помощью библиотек Task и / или Threading и блокировать их до тех пор, пока все ваши параллельные задачи не будут завершены. Однако было бы крайне необычно выполнять такую ​​большую работу при запуске и предполагать, что некоторое переосмысление вашего дизайна может быть в порядке.

Наконец, если вы хотите создавать фоновые задачи, которые выполняются непрерывно, то единственным механизмом в ASP.NET Core для этого является HostedService . Но, в зависимости от того, что вы пытаетесь достичь, возможно, ASP.NET Core просто не тот инструмент для работы.

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