• 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在信号发生之后再次等待,它的信号状态又被自动重置为无信号。

  • 相关阅读:
    进程与线程的区别与联系
    任务、进程、线程
    类、对象、方法、实例方法、类方法
    java 泛型详解
    Java总结篇系列:Java泛型
    html+css+js 实现自动滑动轮播图
    第三篇web前端面试自我介绍(刚毕业的菜鸟)
    怎么写网站的需求文档
    在phpStudy怎么配置虚拟地址
    第二篇web前端面试自我介绍(刚毕业的菜鸟)
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1934430.html
Copyright © 2020-2023  润新知