Если у меня есть контроллер api, и я хочу, чтобы он возвращался пользователю как можно быстрее, в то же время, раскручивая поток для обработки более продолжительного процесса, я подумал, что просто не могу ожидать вызова асинхронного метода, подобного этому.
DoSomeNonAwaitedAsyncThing(data);
var result = await DoSomeNormalAsyncThing(data);
return result;
Но код DoSomeNonAwaitedAsyncThing перестанет выполняться при возврате контроллера api (без исключений или чего-либо еще, что он просто перестает работать).
Если я изменю сигнатуру DoSomeNonAwaitedAsyncThing с асинхронной задачи на async void , тогда поток будет выполняться до завершения, но он также будет блокировать возврат вызова API до тех пор, пока не будет получена не ожидаемая задача.complete.
также, если я изменю способ вызова метода на этот (ниже), то метод будет выполняться до завершения, а не останавливаться на полпути через метод.
Task.Run(async () => { DoSomeNonAwaitedAsyncThing(data); });
Iсоздал репо с проектом, чтобы продемонстрировать проблему.https://github.com/JamesWebDev/AsyncThreadIssueExample
Также стоит отметить, что я добавил это в веб-конфигурацию, чтобы он позволял возвращать вызов API, пока потоки еще работают.
<add key="aspnet:AllowAsyncDuringSyncStages" value="true"/>