Parallel.for () цикл створює неправильні ідентифікатори потоку

Я розробив .net прикладну програму, використовуючи .net framework 4.0, де я використовував цикл parallel.for() для багатопотокових рішень. Я використав таку конфігурацію:

  1. Windows 7
  2. IIS 7.0
  3. Framework v4.0.30319

Я використовував клас ParallelOptions (), а властивість "MaxDegreeOfParallelism" цього класу встановлено в 5. Я ввійшов в журнал "Thread.CurrentThread.ManagedThreadId" у файл журналу, щоб перевірити, чи створено 5 потоків під час виконання. Я протестував цю програму в двох різних середовищах. Коли програма працює в середовищі, де вона була розроблена, він створює 5 ідентифікаторів потоку. Але поки він працює в іншому середовищі, він створює 6 або 7 ідентифікаторів потоків. Програма складається лише в 1-му середовищі. Я використовував опубліковану версію програми для тестування на 2-му середовищі. Чи може хто-небудь мені допомогти, повідомивши, чому це відбувається та як його вирішити?

4

2 Відповіді

Parallel.For uses thread pool threads. The MaxDegreeOfParallelism controls the maximum concurrent number of threads being used, not 5 particular threads - the thread pool is at liberty to process work on any of its threads, and Parallel.For makes sure only 5 are running at the same time.

4
додано

Я вважаю, що це тому, що Parallel.For() використовує тільки динамічний розділювач, який пройшов у масиві, може бути розділений "на льоту", і кожен розділ обробляється окремим пунктом Task/Тема:

  1. MSDN: How to: Implement Dynamic Partitions

    Each time a partition calls MoveNext on the enumerator, the enumerator provides the partition with one list element. In the case of PLINQ and ForEach, the partition is a Task instance. Because requests are happening concurrently on multiple threads, access to the current index is synchronized.

    (I believe the same is true for Parallel.For())

  2. MSDN: Custom Partitioners

    PLINQ supports a fixed number of partitions (although data may be dynamically reassigned to those partitions during run time for load balancing.). For and ForEach support only dynamic partitioning, which means that the number of partitions changes at run time. For more information, see Custom Partitioners for PLINQ and TPL.

2
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug