关于使用ManualResetEvent使用c#

本文关键字:使用 ManualResetEvent 于使用 | 更新日期: 2023-09-27 18:06:00

我不熟悉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 ?由于

关于使用ManualResetEvent使用c#

我建议你阅读ManualResetEvent的MSDN页面的"备注"部分,它非常清楚地说明了这个类的用法。

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

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

http://dotnetpattern.com/threading-manualresetevent


非常简单的解释

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

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

ManualSetEvent是一个帮助你管理不同线程之间通信的类,当一些线程必须停止并等待另一个线程(线程)完成时,这个类非常有用。