Что касается использования 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(), он автоматически вызывает его и выполняет работу.