Когда вы запустите код, ваш первый работник начнет работать, затем следующий застрянет в имеющемся у вас цикле занятости while (Workers > 0) ;
и не будет двигаться, пока предыдущий работник не закончит работу. Затем, когда он запустится, следующий рабочий будет застревать там и т. Д. Для каждой итерации цикла, в котором вы запускаете рабочих.
Таким образом, у вас когда-либо есть только один рабочий, выполняющий работу, и один рабочий привязывает весь ЦП, ожидая его завершения.
Правильный способ синхронизировать доступ при написании асинхронного кода - использовать SemaphoreSlim
и использовать WaitAsync
, что будет асинхронно ждать получения семафора, а не синхронно блокировать поток ( и привязка процессора, пока вы на нем), чтобы другие работники закончили. Он также имеет преимущество в том, что он безопасен для доступа из нескольких потоков, в отличие от целого числа, которое не безопасно для изменения из нескольких потоков.