Используются ли параллельная библиотека задач, PLINQ или параллельные коллекции в веб-приложениях, созданных с использованием ядра Asp.Net Mvc или Razor Pages?

Я новичок в C #, ядре .Net. Итак, у меня очень ограниченные знания по этим продвинутым темам (параллельная библиотека задач, PLINQ или параллельные коллекции). Если мой вопрос показался идиотским, мне очень жаль.

Я разработал небольшие веб-приложения с использованием основных MVC-страниц Asp.Net и страниц Razor. Я использовал async и await в этих веб-приложениях, но никогда не имел возможности использовать TPL, PLINQ или Concurrent collection. В настоящее время я изучаю многопоточность и ищу возможность реализовать TPL, PLINQ или параллельные коллекции в своих веб-приложениях.

Итак, вот мои вопросы,

  1. Используется ли параллельная библиотека задач, PLINQ или параллельные коллекции в веб-приложениях, созданных с помощью ядра MVC Asp.Net или Razor Pages?
  2. Если он используется, то каковы те ситуации, когда TPL, PLINQ более подходят, чем async.
  3. Есть ли какие-нибудь учебники по этой теме ??

[Обновление]

Если я использовал PLINQ, TPL или Concurrent Collection в библиотеке утилит или службах репозитория, это будет слишком много для моих веб-приложений или это создаст тупик или блокировку в моем веб-приложении [ядро .net]

Или я делаю простую вещь очень сложной ??

Спасибо.


person SP Sarkar    schedule 28.10.2020    source источник
comment
Вы спрашиваете, зачем использовать параллелизм при обслуживании отдельных запросов в веб-приложениях?   -  person Theodor Zoulias    schedule 28.10.2020
comment
@TheodorZoulias, если я не ошибаюсь, то интерфейс IAsyncResult используется для использования параллелизма при обслуживании отдельных запросов в веб-приложениях. Но я хочу знать, что PLINQ или TPL можно использовать по-другому в веб-приложениях [ядро .net].   -  person SP Sarkar    schedule 28.10.2020
comment
TBH Я мало знаю об интерфейсе IAsyncResult, но полагаю, что он используется для достижения асинхронности, а не для параллелизма / параллелизма. Другими словами, не для одновременного выполнения двух или более действий, а для того, чтобы не блокировать поток, выполняя одно действие за раз.   -  person Theodor Zoulias    schedule 28.10.2020
comment
@TheodorZoulias Спасибо. Ты прав. Мне есть чему поучиться.   -  person SP Sarkar    schedule 28.10.2020


Ответы (1)


Используется ли параллельная библиотека задач, PLINQ или параллельные коллекции в веб-приложениях, созданных с помощью ядра MVC Asp.Net или Razor Pages?

Короткий ответ: нет для PLINQ и многопоточности.

Во-первых, async / await обернуты вокруг класса Task, который является частью TPL.

Во-вторых, считается плохой практикой параллелизм и запуск нескольких рабочих потоков в приложении ASP.NET (Core).

В ASP.NET Core вы используете TPL и _2 _ / _ 3_ для истинно асинхронных операций (сетевые вызовы, доступ к вводу-выводу (доступ к файлам), вызовы базы данных и т. Д.), Когда приложение должно ждать завершения внешнего аппаратного компонента.

Задачи, связанные с процессором (вычисления и т. Д., Выполняемые в одном или нескольких потоках), не ожидаются в приложениях ASP.NET Core и выполняются только в основном потоке (блокирующим образом).

ASP.NET (унаследованный) раньше имел собственный пул потоков для управления соединениями, а ASP.NET Core просто использует для него пул потоков по умолчанию. В устаревшем ASP.NET у вас все равно будет выполнение одного потока для каждого запроса, даже если вы используете PLINQ, запускайте несколько задач и ожидайте их. ASP.NET Core - нет.

Тем не менее, отвлекать свои собственные задачи и потоки - плохая идея. Это может ускорить вашу однопоточную операцию при небольшом количестве запросов (меньшая задержка), но может сделать ее безответственной в сценариях с большим количеством запросов из-за нехватки потоков и вашего приложения, тратящего много времени ЦП на управление потоками и переключение между потоками. Это также мешает эвристике потоков.

Также при нехватке потоков ваше приложение не будет принимать никаких новых запросов. По этой причине задачи, связанные с ЦП, должны выполняться синхронно. Выполнение работы с привязкой к ЦП только через Task.Run ничего вам не даст. Вы освобождаете поток запроса, ожидая завершения задачи, но поскольку вы запускаете новую задачу, для ее обработки используется другой поток.

Это похоже на выполнение параллельной задачи. Когда вы запускаете много задач на запрос, есть одна точка, в которой у вас есть много задач в очереди и для многих запросов, и приложение перестает принимать запросы, и пользователь получает ужасные 50-кратные HTTP-ошибки для вашего приложения, не принимающего новые запросы, когда не запускается много параллельные задачи позволят вам взять гораздо большее количество подключений и поставить их в очередь, в то время как запросы других задач будут выполнены

Параллелизм и параллельные задачи важны для настольных приложений, и их ожидание имеет смысл (чтобы не блокировать поток пользовательского интерфейса), даже если это одно длительное выполнение. Кроме того, в настольном приложении вы можете быть уверены, что приложение используется только одним пользователем, поэтому использование как можно большего количества ядер ЦП для быстрой обработки задачи - это очень хорошо.

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

person Tseng    schedule 28.10.2020