Я разрабатываю приложение, использующее Windows Workflow. В одной области рабочего процесса используется операция Parallel.ForEach, которая запускает AsyncCodeActivity. Вы можете увидеть это на скриншоте ниже. Операция RunPolicyWorkflow - это AsyncCodeActivity.Ограничить потоки для рабочего процесса Windows
Из того, что я понял из документации Windows Workflow является то, что это будет создавать новые темы, как нужно работать на коллекции, которая в настоящее время перечисленной в ParalleForEach деятельности.
У меня около 16000 элементов в параллельной петле. Внутри цикла (во время действия RunPolicyWorkflow) я выполняю небольшую работу с процессором, но большую часть времени тратится на сохранение результатов на экземпляр SQL Server. При использовании Монитора ресурсов, чтобы следить за моим процессом, я заметил, что в этом процессе было около 2000 потоков, в которых выполнялся рабочий процесс.
Похоже, мое приложение становится медленнее, чем больше потоков, которые он создает. Мой компьютер имеет только 8 логических процессоров, поэтому я уверен, что это не отличная оптимизация.
Кто-нибудь знает, как ограничить количество потоков, создаваемых рабочим процессом Windows? Или у кого-нибудь есть предложения по пути, чтобы это можно было сделать лучше? Все элементы в параллельном цикле независимы друг от друга, и я хочу как можно быстрее обработать все элементы в коллекции (16000). Первоначально его обработка составляет около 300 единиц в минуту, но уменьшается до 60 единиц в минуту, поскольку количество потоков увеличивается, и больше предметов обрабатывается.
Вы уверены, что SQL-сервер может справиться с этой нагрузкой? Эти потоки не все ждут транзакций, которые будут совершены на sql-сервере? – rene
Простой поиск дал http://stackoverflow.com/questions/16365049/restrict-number-of-threads-in-parallel-foreach-in-windows-workflow-foundation-4 – ata