zoukankan      html  css  js  c++  java
  • From MSDN:WaitHandle

    The following code example shows how two threads can do background tasks while the Main thread waits for the tasks to complete using the static WaitAny and WaitAll methods of the WaitHandle class.

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

    魔兽就是毒瘤,大家千万不要玩。
  • 相关阅读:
    思源:秒级体验百亿级数据量监控钻取
    禧云Redis跨机房双向同步实践
    谈谈数据中台技术体系
    RCA:收单设备调用云端接口频繁超时排查总结
    技术上的“深淘滩,低作堰”
    企业私有源代码上传github致入侵之大疆案判决了
    那些年我们一起犯过的错
    异地双活的四个误区
    没有预见性你凭什么晋升
    中国IT史上两大严重事故对我们的警醒及预防措施
  • 原文地址:https://www.cnblogs.com/tracy/p/1763421.html
Copyright © 2011-2022 走看看