AutoResetEvent Reset метод - PullRequest
       23

AutoResetEvent Reset метод

13 голосов
/ 03 мая 2011

Может ли кто-нибудь представить пример использования метода AutoResetEvent.Reset ()?Когда и почему я хотел бы использовать этот метод?Я понимаю WaitOne и Set, но для меня это неясно.

Ответы [ 6 ]

7 голосов
/ 03 мая 2011

Да, AutoResetEvent автоматически сбрасывает свое состояние всякий раз, когда поток, ожидающий события, получает сигнал.Однако возможно, что данное событие больше не является действительным, и ни один поток не ожидал AutoResetEvent с момента его установки.В этом сценарии метод Reset становится полезным

1 голос
/ 03 мая 2011

Если производитель AutoResetEvent хочет очистить событие, вы должны использовать Reset ().Таким образом, вы можете безопасно «сбросить» событие, не зная, сигнализирует ли оно в данный момент.Если производитель использовал WaitOne для «сброса» своего собственного события, существует риск, что вы можете зайти в тупик (т. Е. Никогда не возвращаться, поскольку событие не сигнализируется и поток производителя блокируется).

1 голос
/ 03 мая 2011

Метод унаследован от базового класса EventWaitHandle и используется для (пере) установки AutoResetEvent в его «заблокированное» состояние.

Поскольку AutoResetEvent автоматически войдет в это состояние, как только оно будет сообщено, вы, как правило, никогда не увидите, чтобы этот метод использовался в коде, но для других классов, производных от EventWaitHandle, это было бы гораздо полезнее!

1 голос
/ 03 мая 2011

Похоже, он просто унаследован от EventWaitHandle . Возможно, более полезно с ManualResetEvent, который также наследуется от этого класса?

0 голосов
/ 16 июня 2017

Сброс

Устанавливает состояние события в состояние без сигнала См. EventWaitHandle Класс

Sample

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");
        }
    }
}
0 голосов
/ 03 мая 2011

Вы должны использовать ManualResetEvent при использовании Reset (), так как AutoResetEvent сбрасывает себя, когда поток получил сигнал.

...