概述:AutoResetEvent和ManualResetEvent从字面意思来讲第一个表示的是自动重置,第二个表示手动重置,它们两都有三个方法Reset(),Set(),WaitOne()。在创建对象的时候有一个bool参数,true表示创建有信号的对象,false表示创建无信号的对象。下面来看一段代码:
public partial class Form1 : Form
{
AutoResetEvent autoResetEvent = null;
ManualResetEvent manualResetEvent = null;
public Form1()
{
Form.CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
//创建对象初始化为没有信号
this.autoResetEvent = new AutoResetEvent(false);
//this.manualResetEvent = new ManualResetEvent(false);
创建对象初始化为有信号
//this.autoResetEvent = new AutoResetEvent(true);
//this.manualResetEvent = new ManualResetEvent(true);
}
private void Form1_Load(object sender, EventArgs e)
{
//创建一线程
Thread thread = new Thread(new ThreadStart(Method));
thread.Start();
}
//定义一个线程调用的方法
private void Method()
{
for (int i = 1; i <= 100;i++ )
{
this.label1.Text = i + "";
//将线程堵塞,等待信号
//this.manualResetEvent.WaitOne();
this.autoResetEvent.WaitOne();
Thread.Sleep(1000);
}
}
private void button1_Click(object sender, EventArgs e)
{
this.autoResetEvent.Set();
//this.manualResetEvent.Set();
}
按照这个代码直接执行的话,我们会发现label变为1后就不变了,这是我们如果每点击一次button1那么label就变加1。说明我们没调用一次set方法后,都会自动重置,将信号关闭;如果我们将创建AutoResetEvent的参数改为true,那么说明我们在创建它的时候就给了一次信号,我运行这个程序会发现label变化两次,也就是先变为1再变为2; 如果我们将autoResetEvent注释了,将this.manualResetEvent = new ManualResetEvent(false);注释给取消,当然后面的相应的调用都需要改为manualResetEvent的的调用,这时我们来执行的时候,当程序起来后,label1变为了1,当我们点击button1的时候,label1就不停的加1,说明ManualResetEvent没有自动重置,这就是它们两最大的区别;当然如果我们还是把创建ManualResetEvent对象是的参数修改为true的话,大家想想运行会出现什么个情况呢?如果运行的话lable1就直接不停的加1。
- 上一篇:
- 下一篇: