間違ったスレッドIDを作成するParallel.for()ループ

私は、.netフレームワーク4.0を使用して.netアプリケーションを開発しました。ここでは、マルチスレッド用にparallel.for()ループを使用しています。私は以下の設定を使用しました:

  1. Windows 7
  2. IIS 7.0
  3. フレームワークv4.0.30319

ParallelOptions()クラスを使用し、このクラスの "MaxDegreeOfParallelism"プロパティが5に設定されています。実行時に5つのスレッドが作成されたかどうかを確認するために、ログファイルに "Thread.CurrentThread.ManagedThreadId"私は2つの異なる環境でこのアプリケーションをテストしました。アプリケーションが開発された環境で実行されている場合、スレッドIDは5つ作成されています。しかし、それは他の環境で実行されている間に、6または7つのスレッドIDを作成しています。アプリケーションは第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()は動的パースナーをのみ使用しているため、これは配列で渡されたものがオンザフライで分割され、各パーティションは個別のタスク/糸:

  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
追加された