zoukankan      html  css  js  c++  java
  • ManualResetEvent知识总结

    一、 用法概述

    Manual发音:英[ˈmænjuəl]

    直译,手动重置事件

    开发者的可以手动对线程间的交互进行手动控制.

    二、构造函数

    构造函数,如果为 true,则将初始状态设置为终止;如果为 false,则将初始状态设置为非终止。

    public ManualResetEvent(
    	bool initialState //是否为 终止状态
    )
    

    如果 ManualResetEvent 的初始状态是终止状态(即,如果其通过为 initialState 传递true 创建),则等待 ManualResetEvent 的线程不阻塞。(亦即WaitOne方法不能阻塞当前线程的执行)

    如果初始状态为非终止状态(false),则线程调用 Set() 方法后才不阻塞。

    故:通常情况下,我们初始化为false(非终止状态)

    三、需要理解和掌握的几个方法

    1.WaiOne

    阻止当前线程,直到收到信号(当然初始化状态需要为false)

    WaitOne有几个重载方法,通过时间进行WaitOne,如果超时就不阻塞了.

    其他几个版本:MSDN地址

    2.Set

    将事件状态设置为终止状态,允许一个或多个等待线程继续。

    3.ReSet

    将事件状态设置为非终止状态,导致线程阻止。

    四、Demo(网友提供)

    using System;
    using System.Threading;
    namespace ThreadingTester
    {
    	class ThreadClass
    	{
    		public static ManualResetEvent mre=new ManualResetEvent(false);
    		public static void trmain()
    		{
    			Thread tr = Thread.CurrentThread;
    			Console.WriteLine("thread: waiting for an event");
    			mre.WaitOne(11);
    			Console.WriteLine("thread: got an event");
    			for(int x=0;x < 10;x++)
    			{
    				Thread.Sleep(1000);
    				Console.WriteLine(tr.Name +": " + x);
    			}
    		}
    		static void Main(string[] args)
    
    		{
    			Thread thrd1=new Thread(new ThreadStart(trmain));
    			thrd1.Name="thread1";
    			thrd1.Start();
    			for(int x=0;x < 10;x++)
    			{
    				Thread.Sleep(900);
    				Console.WriteLine("Main:" + x);
    				if(5==x) mre.Set();
    			}
    			while(thrd1.IsAlive)
    			{
    				Thread.Sleep(1000);
    				Console.WriteLine("Main: waiting for thread to stop");
    			}
    			
    			Console.Read();
    		}
    	}
    }
    

      

    五、使用场景

    通常出现用于 不同功能的代码且位于不同的线程之中时, 需要进行数据协同.

     

  • 相关阅读:
    Java实现约瑟夫环问题
    Java实现约瑟夫环问题
    mysql远程表链接
    linux下mysql定时备份
    深入浅出RPC——浅出篇(转载)
    深入浅出RPC——深入篇(转载)
    Qt在Windows上的调试器安装与配置
    VS2015 ASP.NET5 Web项目
    jquery validate remote验证唯一性
    jQuery UI框架
  • 原文地址:https://www.cnblogs.com/humble/p/5888526.html
Copyright © 2011-2022 走看看