AutoResetEvent重置方法

时间:2011-05-03 14:27:28

标签: c# reset autoresetevent

有人可以为AutoResetEvent.Reset()方法引入一个用例吗? 何时以及为什么我想使用这种方法? 我理解WaitOne和Set,但这对我来说还不太清楚。

6 个答案:

答案 0 :(得分:7)

是的,只要发出等待事件的线程,AutoResetEvent就会自动重置它的状态。但是,由于最初设置的事件,某个给定事件可能不再有效且没有线程在AutoResetEvent上等待。在这种情况下,Reset方法变得有用

答案 1 :(得分:1)

看起来它只是从EventWaitHandle继承而来。对于同样继承自该类的ManualResetEvent可能更有用吗?

答案 2 :(得分:1)

该方法继承自基类EventWaitHandle,用于(重新)将AutoResetEvent设置为“阻塞”状态。

因为AutoResetEvent一旦发出信号就会自动进入该状态,您通常不会在代码中看到此方法,但对于从EventWaitHandle派生的其他类,它会更有用!

答案 3 :(得分:1)

如果AutoResetEvent生成器想要清除该事件,则使用Reset()。这样,您可以安全地“重置”事件,而无需知道它当前是否已发出信号。如果生产者使用WaitOne来“重置”它自己的事件,那么就存在死锁的风险(即,由于事件没有发出信号并且生产者线程被阻止,因此永远不会返回)。

答案 4 :(得分:0)

使用Reset()时应该使用ManualResetEvent,因为当线程发出信号时,AutoResetEvent会自行重置。

答案 5 :(得分:0)

重置

  

将事件的状态设置为无信号   ,见EventWaitHandle Class

样品,

using System;
using System.Threading;
namespace ThreadingInCSharp.Signaling
{
    class Program
    {
        static EventWaitHandle _waitHandle = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            //The event's state is Signal
            _waitHandle.Set();
            new Thread(Waiter).Start();
            Thread.Sleep(2000);
            _waitHandle.Set();
            Console.ReadKey();
        }
        private static void Waiter()
        {
            Console.WriteLine("I'm Waiting...");
            _waitHandle.WaitOne();
            //The word pass will print immediately 
            Console.WriteLine("pass");
        }
    }
}

使用重置

using System;
using System.Threading;
namespace ThreadingInCSharp.Signaling
{
    class Program
    {
        static EventWaitHandle _waitHandle = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            //The event's state is Signal
            _waitHandle.Set();
            _waitHandle.Reset();
            new Thread(Waiter).Start();
            Thread.Sleep(2000);
            _waitHandle.Set();
            Console.ReadKey();
        }

        private static void Waiter()
        {
            Console.WriteLine("I'm Waiting...");
            _waitHandle.WaitOne();
            //The word will wait 2 seconds for printing
            Console.WriteLine("pass");
        }
    }
}