13

我不熟悉 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 的良好讨论和用法?谢谢

4

3 回答 3

17

我建议您阅读MSDN 页面ManualResetEvent的“备注”部分,其中非常清楚此类的用法。

为了回答您的具体问题,即使它是异步的,它ManualResetEvent也用于模拟同步调用。Download它调用异步方法并阻塞,直到ManualResetEvent发出信号。在ManualResetEvent基于异步事件的模式的事件处理程序中发出信号。所以基本上它会等到事件被触发并执行事件处理程序。

于 2013-03-27T10:23:16.283 回答
5

换句话说,为了深入理解任何主题,我必须阅读几乎相同的信息。我已经阅读了有关 ManualResetEvent 的 MSDN 文档,这很好,我几乎要理解它,但是这个链接帮助我很好地理解了它:

http://dotnetpattern.com/threading-manualresetevent


非常简单的解释

如果当前线程调用WiatOne()方法,它将等待(所以停止做任何事情),直到任何其他线程调用Set()方法。

WaitOne 的另一个重载是WaitOne(TimeSpan)。这和上面的几乎一样,但是如果给这个方法5 秒的时间,当前线程将等待其他线程调用Set()方法5 秒 ,如果没有人调用Set(),它自动调用它并继续工作。

于 2017-02-22T08:45:46.213 回答
3

ManualSetEvent 是一个类,当某个线程必须停止并等待完成另一个线程(线程)时,它可以帮助您管理不同线程之间的通信,那么该类非常有用。

于 2015-02-04T14:06:37.433 回答