关于WaitHandle的WaitAny

MSDN上的示例代码
https://msdn.microsoft.com/zh-cn/library/system.threading.waithandle(v=vs.110).aspx

……//前面的代码省略了
Console.WriteLine("The main thread is waiting for either task to complete.");
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
int index = WaitHandle.WaitAny(waitHandles);
// The time shown below should match the shortest task.
Console.WriteLine("Task {0} finished first (time waited={1}).",
            index + 1, (DateTime.Now - dt).TotalMilliseconds);
    }

    static void DoTask(Object state) 
    {
        AutoResetEvent are = (AutoResetEvent) state;
        int time = 1000 * r.Next(2, 10);
        Console.WriteLine("Performing a task for {0} milliseconds.", time);
        Thread.Sleep(time);
        are.Set();
     }

输出的结果:
// The main thread is waiting for either task to complete.
// Performing a task for 2000 milliseconds.
// Performing a task for 2000 milliseconds.
// Task 1 finished first (time waited=2000.6528).

问题:既然是WaitAny,怎么两个任务都执行了呢?应该是执行最快的任务结束后,主线程就很快结束了,不会等第二个任务的。不知道为什么?

理论上是这样,但是不确定。尽管waitany只在某个信号量被重置后执行,但是可能主线程并没有被调度,而此时另一个线程也执行完了。
特别是单处理器的情况下。这个是有一定概率的。你可以开100个线程看看,就能看到结果。

WaitHandle.WaitAny 只是表示它等到一个任务就可以了。不是说只执行一个任务,两个任务都会执行,最快的会被 WaitHandle.WaitAny先等到