と の違いを理解しようとしていParralel.For
ますThreadPool.QueueUserWorkItem
。
ハードウェアとソフトウェア:
- Intel i5 (クアッドコア)
- ウィンドウズ 7 64 ビット 教授
- ドットネット 4.5
ケース 1 コード: ThreadPool
for (int index = 0; index < 5; index++)
{
ThreadPool.QueueUserWorkItem((indexParam) =>
{
int threadID = Thread.CurrentThread.ManagedThreadId;
Thread.Sleep(1000);
BeginInvoke((Action)delegate { listBox1.Items.Add("Completed " + indexParam.ToString() + " using thread " + threadID.ToString() + " (" + DateTime.Now.Second.ToString() + "." + DateTime.Now.Millisecond.ToString("000") + ")"); });
}, index);
}
出力:
スレッド 10 を使用して 0 を完了 (45.871)
スレッド 11 を使用して 1 を完了 (45.875)
スレッド 12 を使用して 2 を完了 (45.875)
スレッド 13 (45.875) を使用して 3 を
完了
ケース 2 コード: Parallel.For
ParallelLoopResult result = Parallel.For(0, 5, (int index, ParallelLoopState loopState) =>
{
int threadID = Thread.CurrentThread.ManagedThreadId;
Thread.Sleep(1000);
BeginInvoke((Action)delegate { listBox1.Items.Add("Completed " + index.ToString() + " using thread " + threadID.ToString() + " (" + DateTime.Now.Second.ToString() + "." + DateTime.Now.Millisecond.ToString("000") + ")"); });
});
出力:
スレッド 10 を使用して 0 を完了 (16.923)
スレッド 11 を使用して 1 を完了 (16.925)
スレッド 12 を使用して 2 を完了 (16.925)
スレッド 13 (16.926) を使用して 3 を
完了
質問:
ケース 1 の結果から、アクティブなスレッドは 4 つだけのように見えます。その後、最初の空きスレッドを使用して最後のタスクを完了します。ケース 2 では、5 つのスレッドがすぐに専用になり、「同時に」実行されるようです。
QueueUserWorkItem のスレッド処理で、並列クラスのように 5 番目のスレッドが使用されないのはなぜですか?
(ThreadPool.GetAvailableThreads(...)
1023 個のワーカー スレッドが使用可能であることを確認します)。