回覆列表
  • 1 # lanfengz3

    可以參見 WaitHandle.WaitAll 方法。

    WaitHandle的名稱空間是System.Thread。

    可以為每一個執行緒建立一個

    WaitHandle,比如:

    WaitHandle[] waitHandles = new WaitHandle[]

    {

    new AutoResetEvent(false),

    new AutoResetEvent(false),

    ...

    };

    然後在每條執行緒結束時,set與之相對應的那個 WaitHandle,

    在主執行緒中,使用

    WaitHandle.WaitAll方法來等待所有的WaitHandle,

    比如:

    WaitHandle.WaitAll(waitHandles);

    以下是MSDN中的示例程式碼:

    using System;

    using System.Threading;

    public sealed class App

    {

    // Define an array with two AutoResetEvent WaitHandles.

    static WaitHandle[] waitHandles = new WaitHandle[]

    {

    new AutoResetEvent(false),

    new AutoResetEvent(false)

    };

    // Define a random number generator for testing.

    static Random r = new Random();

    static void Main()

    {

    // Queue up two tasks on two different threads;

    // wait until all tasks are completed.

    DateTime dt = DateTime.Now;

    Console.WriteLine("Main thread is waiting for BOTH tasks to complete.");

    ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);

    ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);

    WaitHandle.WaitAll(waitHandles);

    // The time shown below should match the longest task.

    Console.WriteLine("Both tasks are completed (time waited={0})",

    (DateTime.Now - dt).TotalMilliseconds);

    // Queue up two tasks on two different threads;

    // wait until any tasks are completed.

    dt = DateTime.Now;

    Console.WriteLine();

    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();

    }

    }

    // This code produces output similar to the following:

    //

    // Main thread is waiting for BOTH tasks to complete.

    // Performing a task for 7000 milliseconds.

    // Performing a task for 4000 milliseconds.

    // Both tasks are completed (time waited=7064.8052)

    //

    // 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).

  • 中秋節和大豐收的關聯?
  • 兒童房應該選擇什麼樣材質的地毯?