Что касается использования ManualResetEvent С#?
Я не знаком с использованием ManualResetEvent?
Связано ли это с потоком. что он делает и когда он используется?
здесь я получил код, в котором используется ManualResetEvent, но я просто не понимаю, что он делает?
вот код
public class Doc : SomeInterfaceFromTheDll
{
private readonly IVersion version; // An interface from the DLL.
private readonly ManualResetEvent _complete = new ManualResetEvent(false);
private bool downloadSuccessful;
// ...
public bool Download()
{
this.version.DownloadFile(this);
// Wait for the event to be signalled...
_complete.WaitOne();
return this.downloadSuccessful;
}
public void Completed(short reason)
{
Trace.WriteLine(string.Format("Notify.Completed({0})", reason));
this.downloadSuccessful = reason == 0;
// Signal that the download is complete
_complete.Set();
}
// ...
}
в чем смысл _complete.WaitOne(); & _complete.Set(); ?
может кто-нибудь дать мне небольшой пример кода, где будет использоваться использование класса ManualResetEvent.
ищет хорошее обсуждение и использование ManualResetEvent? спасибо
Ответы
Ответ 1
Я предлагаю вам прочитать раздел "примечания" на странице MSDN ManualResetEvent
, что довольно ясно говорит об использовании этого класса.
Чтобы ответить на ваш конкретный вопрос, ManualResetEvent
используется для имитации синхронного вызова Download
, даже если он асинхронный. Он вызывает метод асинхронизации и блокирует до тех пор, пока не будет сигнализирован символ ManualResetEvent
. ManualResetEvent
сигнализируется в обработчике событий шаблона async-события. Таким образом, в основном он ждет, пока событие не будет запущено, и обработчик события будет выполнен.
Ответ 2
ManualSetEvent - это класс, который помогает вам управлять связью между различными потоками, когда какой-то поток должен быть остановлен и ждать завершения другого потока (потоков), тогда этот класс очень полезен.
Ответ 3
Чтобы достичь глубокого понимания любого предмета, я должен прочитать почти такую же информацию другими словами.
Я прочитал документацию MSDN о ManualResetEvent, хорошо, что я почти понял это, но эта ссылка помогла мне понять это хорошо:
http://dotnetpattern.com/threading-manualresetevent
ОЧЕНЬ Простое объяснение
Если текущий поток вызывает метод WiatOne(), он будет ждать (так что прекратите делать что-либо), пока какой-либо другой поток не вызовет метод Set().
Есть еще одна перегрузка для WaitOne, это WaitOne (TimeSpan).
Это почти то же самое, что и выше, но если для eaxample укажите 5 секунд время для этого метода, текущий поток будет ожидать, пока другой поток вызовет Set() метод 5 секунд, и если никто не вызвал Set(), он автоматически вызывает его и выполняет работу.