Как использовать асинхронную, параллельную задачу в классе контроллера - Web API? - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь сделать свои API REST более отзывчивыми, используя подход Async или Parallel Async Task.Вот мой код, который является синхронным по своей природе.Я понятия не имею, как я могу сделать его более отзывчивым, используя Async или Parallel TPL.

 [HttpGet]
        public async Task<string> Get([FromQuery(Name = "number")] long number)
        {

Это оригинальный Синхронный код -

[HttpGet]
    public string Get([FromQuery(Name = "number")] long number)
    {
        ulong lastItem = (ulong)number;
        ulong fact = 1;
        for (ulong i = 1; i < lastItem; i++)
        {
            fact = fact * i;
        }
        return fact.ToString();
    }

Я хочу сделать этот код быстреепри использовании REST API - звонки.Мой план - использовать Task Parallel, но я не уверен, как я могу это сделать?Как только я смогу это сделать, я проверю, улучшена ли производительность или нет.

1 Ответ

0 голосов
/ 23 января 2019

async не делает ничего быстрее, это функция масштабируемости, которая косвенно может повысить производительность, но для небольшого сайта, вероятно, нет.

Что касается вашего вопроса, нет смысла делатьэтот вызов async, его рабочая нагрузка CPU , он не будет использовать порт завершения ввода-вывода и будет использовать поток пула потоков и блокировать его (из-за отсутствия лучшего слова)независимо от того, каким образом вы это делаете.Короче говоря, не существует операции IO Bound для async, чтобы она действовала по-настоящему волшебно

Конечно, вы могли бы сделать это

return await Task.Run(() =>
{
   ulong lastItem = (ulong)number;
   ulong fact = 1;

   for (ulong i = 1; i < lastItem; i++)
   {
      fact = fact * i;
   }

   return fact;
});

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

IMO, вам просто лучше оставить все как есть.

...