У меня есть метод в приложении ASP.NET, который требует довольно много времени для завершения. Вызов этого метода может возникать до 3 раз в течение одного пользовательского запроса в зависимости от состояния кэша и параметров, которые пользователь предоставляет. Каждый вызов занимает около 1-2 секунд. Сам метод является синхронным вызовом службы, и нет возможности переопределить реализацию.
Таким образом, синхронный вызов службы выглядит примерно так:
public OutputModel Calculate(InputModel input)
{
// do some stuff
return Service.LongRunningCall(input);
}
И использование метода (обратите внимание, что вызов метода может произойти более одного раза):
private void MakeRequest()
{
// a lot of other stuff: preparing requests, sending/processing other requests, etc.
var myOutput = Calculate(myInput);
// stuff again
}
Я попытался изменить реализацию с моей стороны, чтобы обеспечить одновременную работу этого метода, и вот что я дошел до сих пор.
public async Task<OutputModel> CalculateAsync(InputModel input)
{
return await Task.Run(() =>
{
return Calculate(input);
});
}
Использование (часть кода "делать другие вещи" выполняется одновременно с вызовом службы):
private async Task MakeRequest()
{
// do some stuff
var task = CalculateAsync(myInput);
// do other stuff
var myOutput = await task;
// some more stuff
}
Мой вопрос следующий. Я использую правильный подход, чтобы ускорить выполнение в приложении ASP.NET, или я делаю ненужную работу, пытаясь запустить синхронный код асинхронно? Может ли кто-нибудь объяснить, почему второй подход не является вариантом в ASP.NET(если это действительно не так)? Кроме того, если такой подход применим, мне нужно вызвать такой метод асинхронно, если это единственный вызов, который мы могли бы выполнить в данный момент (у меня есть такой случай, когда нет другого материала, который нужно сделать, ожидая завершения)?
Большинство статей в сети по этому вопросу охватывает использование подхода async-await
с кодом, который уже предоставляет методы awaitable
, но это не мой случай. Здесь - хорошая статья, описывающая мой случай, который не описывает ситуацию с параллельными вызовами, отклоняя опцию обертывания вызова синхронизации, но в моем мнение моя ситуация - это именно то, что нужно сделать.
Заранее благодарим за помощь и советы.