我不熟悉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?感谢
答案 0 :(得分:17)
我建议你阅读MSDN page of ManualResetEvent
的“备注”部分,该部分对此课程的用法非常清楚。
要回答您的具体问题,ManualResetEvent
用于模拟对Download
的同步调用,即使它是异步的。它调用异步方法并阻塞,直到ManualResetEvent
发出信号。 ManualResetEvent
在基于异步事件的模式的事件处理程序中发出信号。所以基本上它会等到事件被触发并执行事件处理程序。
答案 1 :(得分:4)
为了深入理解任何主题,我必须阅读几乎相同的信息。 我已经阅读了有关ManualResetEvent的MSDN文档,我几乎理解它很好,但这个链接帮助我理解它:
http://dotnetpattern.com/threading-manualresetevent
非常简单的解释
如果当前线程调用 WiatOne()方法,它将等待(所以停止做任何事情),直到任何其他线程调用 Set()方法。
WaitOne还有另一个重载,是 WaitOne(TimeSpan)。 这与上面几乎相同,但是如果eaxample给这个方法 5秒时间,当前线程将等待其他线程调用 Set() 5秒的方法如果没有人叫 Set(),它会自动调用它并使工作恢复正常。
答案 2 :(得分:3)
ManualSetEvent是一个类,它可以帮助您在必须停止某个线程时等待不同线程之间的通信,并等待完成另一个线程(线程),然后该类非常有用。