Что ж, вы понимаете, что все правильно, но вам нужно понимать базовые ядра, количество физических ядер, которые есть у вашей машины.
Вы можете создать несколько задач за один раз, но это не означает, что все эти задачи выполняются в parellel, каждая задача представляет поток и запланировано получение на физическом ядре, в свою очередь, одно ядро запускает один поток за раз.
Таким образом, если на вашем компьютере запущено 4 ядра, и вы создали 8 потоков, тогда ваш mahcine будет запускать только 4 потока, а другой поток получит очередь, когда поток запланирован на ядре, если запущенный поток заблокирован или находится в состоянии ожидания или завершен,
Выше я хочу сказать, что когда вы делаете параллельный код, вы также должны учитывать количество физических ядер, которые у вас есть на вашем компьютере.это может быть одной из причин того, что ваш код не использует преимущества параллельного кодирования, которое вы сделали.
Еще одна вещь, если число ядер меньше количества задач / потоков, тогда будет слишком много переключений контекста, когда это может замедлить и вашу программу.
Добавление к вышеупомянутой параллельной библиотеке задачПод капотом используют Threadpool, а потоки в пуле потоков рекомендуется использовать для небольших операций.поскольку длительная операция может потреблять ваш пул потоков, а затем ваша короткая операция должна ждать завершения потока, что также замедляет работу вашего приложения.Поэтому рекомендуется создавать задачу с помощью TaskCreationOptions.LongRunning
или использовать async/await
, чтобы поток потоков не получал cosume для длительных операций (операция с базой данных, операция чтения / записи файла или внешний вызов web / webservcie для получения данных).
Помимо вышеуказанного в вашем коде,
var results = await Task.WhenAll(tasks);
это означает ожидание завершения выполнения всех задач, что означает, что если у вас есть 5 задач и 3 из них завершены, но 2из них требуется больше времени для завершения, затем код будет ждать завершения двух длительных задач перед выполнением следующей строки.
Проверьте также: можно ли совместно использовать одно соединение SQL Server для задач, выполняемых параллельно
Соединение SQLServer может совместно использоваться несколькими задачами, выполняющимися параллельноНапример, потоки в программе на C # или запросы на сервере приложений.Но в большинстве сценариев использования вам потребуется синхронизировать доступ к Соединению.Задача должна будет ждать соединения, если другая задача использует его.К тому времени, когда вы создадите механизм общего подключения, который не нарушает и не становится ограничением производительности для ваших параллельных задач, вы, вероятно, уже создали пул соединений.