Вы можете сделать это , если RunAsync
делает запросы ввода / вывода , но вы не вернете Task
:
[HttpPost("run")]
public object Run([FromBody] ResearchRequest researchRequest)
{
researchService.RunAsync(researchRequest);
return new{ queued = true };
}
Это запустит RunAsync
в том же потоке, как и любой другой метод. В первом await
в RunAsync
, который действует на неполное Task
, RunAsync
вернет свой собственный неполный Task
, после чего управление вернется к вашему действию Run
, и ваш object
будет возвращен , Вы не будете ждать операции ввода-вывода, которую RunAsync
сделает.
Если RunAsync
занимает много времени из-за вычислений ЦП (не ввода-вывода), то это ничего не изменит для вас, потому что, помните, он начинает работать в том же потоке. Вам придется запустить его в другом потоке, что можно сделать, используя Task.Run
:
[HttpPost("run")]
public Task<object> Run([FromBody] ResearchRequest researchRequest)
{
Task.Run(() => researchService.RunAsync(researchRequest));
return new{ queued = true };
}
Но!
В обоих случаях ASP. NET не будет знать, что RunAsync
работает в фоновом режиме. Если пул приложений IIS по какой-либо причине будет закрыт или переработан, это задание будет завершено на полпути. Обратите внимание, что по умолчанию IIS настроен на отключение пула приложений после 20 минут отсутствия поступающих HTTP-запросов.
Если это неприемлемо для вас, лучше записать задание в очередь в база данных или что-то и делает эту фоновую обработку в Windows службе.