zoukankan      html  css  js  c++  java
  • ManulResetEvent与AutoResetEvent

    定义

    ManualResetEvent:通知正在等待的线程已发生事件。

    AutoResetEvent:通知正在等待的线程已发生事件。

    代码

    ManualResetEvent测试

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading;

    namespace NetThreading.UserThread

    {

    /// <summary>

    /// ManualAutoResetEvent的用法

    /// </summary>

    public class ManualResetEventApp:IMain

    {

    #region IMain 成员

    public void MainRun()

    {

    Console.WriteLine("ManualResetEvent ---------------------------------");

    //指定ManualResetEvent的初始状态为无信号状态,ManualResetEvent等待5秒后超时,

    //ManualResetEvent的状态仍是无信号状态

    Console.WriteLine("ManualResetEvent default state:fase ");

    ManualResetEvent manualResetEvent = new ManualResetEvent(false);

    //ManualResetEvent 初始值为false,ManualResetEvent一直等待有信号,等待超时时间为5s

    Console.WriteLine("ManualResetEvent 初始值为false,ManualResetEvent一直等待有信号,等待超时时间为5s");

    bool currentResult=manualResetEvent.WaitOne(TimeSpan.FromSeconds(5));

    Console.WriteLine(string.Format("ManualResetEvent:After wait State:{0}",currentResult));

    //指定ManualResetEvent的初始状态为有信号状态,ManualResetEvent等待5秒后超时,

    //ManualResetEvent的状态仍是有信号状态

    Console.WriteLine("ManualResetEvent default state:true ");

    manualResetEvent = new ManualResetEvent(true );

    //ManualResetEvent 初始值为true,ManualResetEvent不用等待,超时时间不起作用

    Console.WriteLine("ManualResetEvent 初始值为true,ManualResetEvent不用等待,超时时间不起作用");

    currentResult = manualResetEvent.WaitOne(TimeSpan.FromSeconds(5));

    Console.WriteLine(string.Format("ManualResetEvent:After wait State:{0}", currentResult));

    //改变信号状态

    Console.WriteLine("改变信号状态");

    Console.WriteLine("ManualResetEvent default state:fale ");

    manualResetEvent = new ManualResetEvent(false );

    Console.WriteLine("will set");

    manualResetEvent.Set();

    Console.WriteLine("ManualResetEvent 设置为有信号,状态改变,ManualResetEvent不会等待");

    Console.WriteLine("after set ");

    currentResult = manualResetEvent.WaitOne(TimeSpan.FromSeconds(10));

    Console.WriteLine(string.Format("ManualResetEvent:After wait State:{0}", currentResult));

    Console.WriteLine("AutoResetEvent 再次等待(超时时间10s)");

    currentResult = manualResetEvent.WaitOne(TimeSpan.FromSeconds(10));

    Console.WriteLine(string.Format("manualResetEvent:After wait State:{0}", currentResult));

    }

    #endregion

    }

    }

    AutoResetEvent测试

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading;

    namespace NetThreading.UserThread

    {

    /// <summary>

    /// AutoResetEventApp的用法

    /// </summary>

    public class AutoResetEventApp:IMain

    {

    #region IMain 成员

    public void MainRun()

    {

    Console.WriteLine("AutoResetEvent ---------------------------------");

    //指定AutoResetEvent的初始状态为无信号状态,AutoResetEvent等待5秒后超时,

    //AutoResetEvent的状态仍是无信号状态

    Console.WriteLine("AutoResetEvent default state:fase ");

    AutoResetEvent autoResetEvent = new AutoResetEvent(false);

    //AutoResetEvent 初始值为false,AutoResetEvent一直等待有信号,等待超时时间为5s

    Console.WriteLine("AutoResetEvent 初始值为false,AutoResetEvent一直等待有信号,等待超时时间为5s");

    bool currentResult = autoResetEvent.WaitOne(TimeSpan.FromSeconds(5));

    Console.WriteLine(string.Format("AutoResetEvent:After wait State:{0}", currentResult));

    //指定AutoResetEvent的初始状态为有信号状态,AutoResetEvent等待5秒后超时,

    //AutoResetEvent的状态仍是有信号状态

    Console.WriteLine("AutoResetEvent default state:true ");

    autoResetEvent = new AutoResetEvent(true);

    //AutoResetEvent 初始值为true,AutoResetEvent不用等待,超时时间不起作用

    Console.WriteLine("AutoResetEvent 初始值为true,AutoResetEvent不用等待,超时时间不起作用");

    currentResult = autoResetEvent.WaitOne(TimeSpan.FromSeconds(5));

    Console.WriteLine(string.Format("AutoResetEvent:After wait State:{0}", currentResult));

    //改变信号状态

    Console.WriteLine("改变信号状态");

    Console.WriteLine("AutoResetEvent default state:fale ");

    autoResetEvent = new AutoResetEvent(false);

    Console.WriteLine("will set");

    autoResetEvent.Set();

    Console.WriteLine("AutoResetEvent 设置为有信号,状态改变,AutoResetEvent不会等待");

    Console.WriteLine("after set ");

    currentResult = autoResetEvent.WaitOne(TimeSpan.FromSeconds(10));

    Console.WriteLine(string.Format("AutoResetEvent:After wait State:{0}", currentResult));

    Console.WriteLine("AutoResetEvent 再次等待(超时时间10s)");

    currentResult = autoResetEvent.WaitOne(TimeSpan.FromSeconds(10));

    Console.WriteLine(string.Format("AutoResetEvent:After wait State:{0}", currentResult));

    }

    #endregion

    }

    }

    运行结果

    clip_image002

    结论

    共同点:

    ManualResetEvent与AutoResetEvent都是在没有信号的情况下等待。一旦有信号,两者都是立即执行,不等待。

    不同点:

    ManualResetEvent:信号发生改变之后在下一次等待中信号状态不会发生变化,而AutoResetEvent在信号发生之后再次等待,它的信号状态又被自动重置为无信号。

  • 相关阅读:
    上传文件插件-bootstrap-fileinput
    js【jquery】
    html
    CSS3中的vh、vw及其应用场景
    element,点击查看,实现tab切换:
    js 遍历tree的一个例子(全遍历),更复杂的功能
    js 遍历tree的一个例子(全遍历)
    js 遍历tree的一个例子
    您的连接不是私密连接
    Es6中Map对象和Set对象的介绍及应用
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1934430.html
Copyright © 2011-2022 走看看