zoukankan      html  css  js  c++  java
  • WaitAny, WaitAll 和 SignalAndWait

    除了Set 和 WaitOne方法外,在类WaitHandle中还有一些用来创建复杂的同步过程的静态方法。

    WaitAny, WaitAll 和 SignalAndWait使跨多个可能为不同类型的等待句柄变得容易。 SignalAndWait可能是最有用的了:他在某个WaitHandle上调用WaitOne,并在另一个WaitHandle上自动地调 用Set。 你可以在一对EventWaitHandle上装配两个线程,而让它们在某个时间点“相遇” 第一个线程像这样: WaitHandle.SignalAndWait (wh1, wh2); 同时第二个线程做相反的事情:WaitHandle.SignalAndWait (wh2, wh1);

    WaitHandle.WaitAny等待一组等待句柄任意一个发出信号,WaitHandle.WaitAll等待所有给定的句柄发出信号。与票据 旋转门的例子类似,这些方法可能同时地等待所有的旋转门——通过在第一个打开的时候(WaitAny情况下),或者等待直到 它们所有的都打开(WaitAll情况下)。

    private AutoResetEvent event_ImageCaptureCmp = new AutoResetEvent(false); //图像采集完成事件
    private AutoResetEvent event_SoftTriggerCmp = new AutoResetEvent(false); //软件触发后,获取图片完成,防止两次触发,图像被覆盖
    private AutoResetEvent event_TestComplete = new AutoResetEvent(false); //一个测试流程所有图片都处理完成

    WaitHandle [] waitHandle = new WaitHandle[]{event_ImageCaptureCmp,
    event_SoftTriggerCmp, event_TestComplete
    };
    event_TestComplete.Set();
    int i = WaitHandle.WaitAny(waitHandle,1000);     //返回2 ,  ?没有任何Event 时,返回258

    //不支持一个 STA 线程上针对多个句柄的 WaitAll。WaitAll 不能在单线程中使用

    解决方法1

    ThreadPool.QueueUserWorkItem(DoWork);

    public void DoWork(object state)
    {
    ManualResetEvent[] manualEvents =
    new ManualResetEvent[5];
    for (int i = 0; i < 5; i++)
    {
    manualEvents[i] = new ManualResetEvent(true);
    }
    bool b = WaitHandle.WaitAll(manualEvents, 100);

    b = true;
    }

    解决方法2

    public bool Waitall()
    {
    ManualResetEvent[] manualEvents =
    new ManualResetEvent[5];
    for (int i = 0; i < 5; i++)
    {
    manualEvents[i] = new ManualResetEvent(true);
    }
    bool b = WaitHandle.WaitAll(manualEvents, 100);


    return b;
    }

    public async void AsyncWaitAll()
    {
    await Task<bool>.Run<bool>(() => Waitall());
    }

  • 相关阅读:
    常见寻找OEP脱壳的方法
    Windows内核原理系列01
    HDU 1025 Constructing Roads In JGShining's Kingdom
    HDU 1024 Max Sum Plus Plus
    HDU 1003 Max Sum
    HDU 1019 Least Common Multiple
    HDU 1018 Big Number
    HDU 1014 Uniform Generator
    HDU 1012 u Calculate e
    HDU 1005 Number Sequence
  • 原文地址:https://www.cnblogs.com/profession/p/4958085.html
Copyright © 2011-2022 走看看