Подтвердить что ты не робот

Метод AutoResetEvent Reset

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

Reset

Устанавливает состояние события в несогласованное, См. 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 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");
        }
    }
}

Используя Reset,

using System;
using System.Threading;
namespace ThreadingInCSharp.Signaling
{
    class Program
    {
        static EventWaitHandle _waitHandle = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            //The event 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");
        }
    }
}