20

有人可以介绍 AutoResetEvent.Reset() 方法的用例吗?我什么时候以及为什么要使用这种方法?我了解 WaitOne 和 Set 但这对我来说还不清楚。

4

6 回答 6

10

是的,AutoResetEvent只要有正在等待事件的线程发出信号,它就会自动重置它的状态。但是,给定事件可能不再有效,并且AutoResetEvent自最初设置以来没有线程等待。在那种情况下,该Reset方法变得有用

于 2011-05-03T14:38:23.370 回答
1

看起来它只是继承自EventWaitHandle。可能对也继承自该类的 ManualResetEvent 更有用?

于 2011-05-03T14:31:53.527 回答
1

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

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

于 2011-05-03T14:33:13.873 回答
1

如果 AutoResetEvent 生产者想要清除事件,您将使用 Reset()。这样,您可以安全地“重置”事件,而不必知道它当前是否已发出信号。如果生产者使用 WaitOne 来“重置”它自己的事件,则存在死锁的风险(即永远不会返回,因为未发出事件信号并且生产者线程被阻塞)。

于 2011-05-03T14:35:35.783 回答
1

重置

将事件的状态设置为 nonsignaled ,请参阅EventWaitHandle 类

样本,

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");
        }
    }
}
于 2017-06-16T03:35:34.963 回答
0

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

于 2011-05-03T14:32:30.010 回答