1

Мы просматриваем наш текущий логический/бизнес-уровень с помощью WebAPI. Согласно моему пониманию, если мы хотим сохранить самооценку от голода в потоке для запросов, мы должны создать контроллер Async WebAPI, поэтому может возникнуть большое количество одновременных запросов.Создание оболочки async WebApi по существующему коду

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

Ниже приведен код, который я использую:

public async Task<IHttpActionResult> Get() 
{ 
    var result = await Task.Run(() => Service.GetAllCompanies()); //existing business layer 
    return Ok(result); 
} 

Обертывание основного слоя в задаче, это хорошо, чтобы продолжить и достичь цели.

+1

Каждый запрос HTTP уже работает в отдельном потоке, так что вы не получите ничего. –

ответ

5

Мое понимание заключается в том, что если ваши реализации-ed методов не являются асинхронными, то вы на самом деле не выполняете то, что считаете себя. Если у вас есть методы обслуживания с привязкой к процессору, вы просто выпускаете поток из пула обработки запроса и затем разворачиваете новый (из того же пула, заметьте), когда вы Task.Run();. Таким образом, вы несете некоторые накладные расходы от этого коммутатора, но пул потоков ASP.NET все еще выполняет работу, поэтому вы не достигли того, чего хотите.

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

Ссылка: https://msdn.microsoft.com/en-us/magazine/dn802603.aspx

+0

В конце все эти базовые методы попадают в базу данных, и поскольку это устаревший код, мы не можем сделать их async. Это означает, что нет необходимости создавать цепочку асинхронных методов (API-контроллер-> Бизнес-> Уровень реализации), если ваш метод db (в нашем случае) не может быть асинхронным. –

+0

Да, поэтому я не думаю, что вы увидите преимущество 'Task.Run();' -в этих методах. Рабочая нагрузка распределяется только по другому потоку из одного пула. –

+3

На самом деле 'Task.Run' будет * больно *, потому что он выпускает исходный поток, а затем использует и блокирует другой поток threadpool. Коммутация не требует затрат на процессор. При размещении в облаке это означает, что вам понадобится более крупная машина для обслуживания одной и той же нагрузки –