Может ли кто-нибудь ввести пример использования для метода AutoResetEvent.Reset()? Когда и почему я хотел бы использовать этот метод? Я понимаю WaitOne и Set, но для меня это не совсем понятно.
Метод AutoResetEvent Reset
Ответ 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");
}
}
}