你的位置:首页 > ASP.net教程

[ASP.net教程]多线程AutoResetEvent


我们在线程编程的时候往往会涉及到线程的通信,通过信号的接受来进行线程是否阻塞的操作。

AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

AutoResetEvent 的方法有很多,具体方法和扩展方法请详见AutoResetEvent类,最常用方法中就有Set()和WaitOne()。

线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程通过调用 Set 发出资源可用的信号。AutoResetEvent 的非终止状态可以通过构造函数在设置:

static AutoResetEvent myResetEvent = new AutoResetEvent(false);

这里构造函数中的参数false就代表该状态为非终止状态,相反若为true则为终止状态。

通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。下面我们来举一个例子:

public class Program  {    static AutoResetEvent myResetEvent = new AutoResetEvent(false);    const int cycleNum = 5;    static void Main(string[] args)    {      Thread td = new Thread(new ThreadStart(sqrt));      td.Name = "线程一";      td.Start();      Console.ReadKey();    }    /// <summary>    /// 计算平方    /// </summary>    /// <param name="i"></param>    public static void sqrt()    {      myResetEvent.WaitOne();      Console.WriteLine(DateTime.Now.ToShortTimeString() + "线程一执行");      Thread.Sleep(500);    }  }

上面例子中一开始非终止状态,当遇到WaitOne()方法时则会阻塞线程,在没有set()时将一直处于阻塞状态,运行结果如下:

QQ20160505194632_thumb5

接下来我们在主函数中执行Set()方法来解放被阻塞的线程:

public class Program  {    static AutoResetEvent myResetEvent = new AutoResetEvent(false);    const int cycleNum = 5;    static void Main(string[] args)    {      Thread td = new Thread(new ThreadStart(sqrt));      td.Name = "线程一";      td.Start();      myResetEvent.Set();//WaitOne方法阻塞,Set()方法执行后则继续执行      Console.ReadKey();    }    /// <summary>    /// 计算平方    /// </summary>    /// <param name="i"></param>    public static void sqrt()    {      myResetEvent.WaitOne();      Console.WriteLine(DateTime.Now.ToShortTimeString() + "线程一执行");      Thread.Sleep(500);    }  }

运行结果如下:

image_thumb1


既然说到了AutoResetEvent,就不得不说ManualResetEvent,这两个方法几乎相同,不同的地方就在于AutoResetEvent的WaitOne()方法执行后会自动又将信号置为不发送状态也就是阻塞状态,当再次遇到WaitOne()方法是又会被阻塞,而AutoResetEvent则不会,只要线程处于非阻塞状态则无论遇到多少次WaitOne()方法都不会被阻塞,除非调用ReSet()方法来手动阻塞线程。这里就不截图运行结果了,有兴趣的朋友可以自己试一试。

本博客不保证所有信息全部正确,有错误还希望指出。

作者:依封剑白
出处:学习:多线程之AutoResetEvent
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。



江苏旅游路线推荐江苏自驾游攻略江苏旅游线路大全什么时候去江苏旅游最好江苏跟团旅游报价多少乐昌龙王潭图片?韶关龙王潭漂亮吗? 相约红河绿春享受长古宴 品味曲靖罗平滇王老窖珍品 乐昌龙王潭在哪里坐车?韶关龙王潭坐车要多长时间? 美女魂牵梦萦罗平酒香 品滇王老窖醉美其味 信宜怎么样去大仁山?茂名信宜大仁山交通线路? 信宜大仁山网上购票多少钱?大仁山门票预订? 信宜大仁山一日游攻略?茂名信宜大仁山门票多少钱? 大仁山要门票吗?信宜大仁山现在门票10元是真的吗? 恩平岑洞峡谷在什么地方?岑洞大峡谷漂流地址? 赣江源漂流需要带什么?赣州石城赣江源漂流需要带雨衣吗? 恩平岑洞峡谷简介?岑洞大峡谷漂流介绍? 恩平岑洞峡谷漂多少公里?岑洞大峡谷漂流漂多久? 12月份三亚的天气怎样?要穿什么衣服? 感恩节做什么好? 海南的治安怎么样?好吗? 怎么去鼓浪屿的漫漫悠悠旅馆? 553-0006-804F Datasheet 553-0006-804F Datasheet 553-0006-805 Datasheet 553-0006-805 Datasheet 553-0006-805F Datasheet 553-0006-805F Datasheet 牡丹江到香港游价格 牡丹江到香港游价格 牡丹江到香港游价格 内蒙古跟团去港澳价格 内蒙古跟团去港澳价格 内蒙古跟团去港澳价格 佳木斯到港澳旅游价格 佳木斯到港澳旅游价格 佳木斯到港澳旅游价格