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

  • 相关阅读:
    ciancd开源
    Deployment Pipeline using Docker, Jenkins, Java
    Jenkins与.NET项目
    设置jenkins代理
    p4 是否能自动merge
    jenkins和docker 使用docker作为slave
    jenkins插件 build timeout和build timestamp
    jenkins 插件开发资料
    jenkins2 pipeline 语法快速参考
    jenkins2 pipeline插件的10个最佳实践
  • 原文地址:https://www.cnblogs.com/profession/p/4958085.html
Copyright © 2011-2022 走看看