Может кто-нибудь объяснить это странное поведение при работе с ThreadPool?

Код
using System;
using System.Threading;

public delegate void LoadingProgressCallback(double PercentComplete,string ItemName);
public delegate void LoadCompleteCallback(int ItemID, string ItemName);

public static class Program
{
    public static void Main(string[] args)
    {
        LoadTest loadTest = new LoadTest();
        loadTest.LoadItems(args);
    }
}

public class LoadTest
{       
    ManualResetEvent resetEvent;
    int numThreads = 0;

    public LoadTest()
    {}

    public void LoadItems(string[] Items)
    {
        numThreads = 0;
        resetEvent = new ManualResetEvent(false);

        foreach(string item in Items)
        {
            Console.WriteLine("Adding {0} to ThreadPool",item);
            ThreadPool.QueueUserWorkItem
            (
                delegate
                {
                    Load(item, this.progCall, this.compCall);
                }
            );
            numThreads++;

            Thread.Sleep(100);//Remove this line

        }
        resetEvent.WaitOne();
    }

    public void progCall(double PercentComplete, string ItemName)
    {
        Console.WriteLine("{0}: is {1}% Complete [THREAD:{2}]",ItemName,PercentComplete.ToString(),Thread.CurrentThread.ManagedThreadId.ToString());
    }
    public void compCall(int ItemID, string ItemName)
    {
        Console.WriteLine("{0}: is Complete",ItemName);
        numThreads--;
        if(numThreads == 0)
        {
            resetEvent.Set();
        }
    }

    public void Load(string Item, LoadingProgressCallback progressCallback, LoadCompleteCallback completeCallback)
    {
        Console.WriteLine("Loading: {0} [THREAD:{1}]",Item,Thread.CurrentThread.ManagedThreadId.ToString());

        for(int i = 0; i <= 100; i++)
        {
            if(progressCallback != null)
            {
                progressCallback((double)i, Item);
            }
            Thread.Sleep(100);
        }
        if(completeCallback != null)
        {
            completeCallback(0,Item);
        }
    }
}
наблюдение

Если я запускаю эту программу из командной строки, вот так ...

>TheProgram item1 item2

Вывод будет выглядеть так.

Добавление item1 в ThreadPool
Загрузка: item1 [THREAD: 3]
Item1: 0% выполнено [THREAD: 3]
Добавление item2 в ThreadPool
Загрузка: item2 [THREAD: 4]
Item2: 0% выполнено [THREAD: 4]
item1: 1% выполнено [THREAD: 3]
Item2: 1% выполнено [THREAD: 4]
Item1: 2% выполнено [THREAD: 3]
Item2: 2% выполнено [THREAD: 4]

Однако, если я уберу эту строку.

Thread.Sleep(100);//Remove this line

ИзLoadItems Метод, вывод выглядит следующим образом.

Добавление item1 в ThreadPool
Добавление item2 в ThreadPool
Загрузка: item2 [THREAD: 4]
Загрузка: item2 [THREAD: 3]
Item2: 0% выполнено [THREAD: 4]
item2: 0% выполнено [THREAD: 3]
Item2: 1% выполнено [THREAD: 4]
item2: 1% выполнено [THREAD: 3]
Item2: 2% выполнено [THREAD: 3]
Item2: 2% выполнено [THREAD: 4]

Вопрос

Кажется, что используются два потока, хотя оба они, похоже, действуют на одни и те же данные. Почему код ведет себя так?

Ответы на вопрос(2)

Ваш ответ на вопрос