Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regarding the use of ManualResetEvent usage c#?

i am not familiar with the usage of ManualResetEvent ?

is it thread related. what it does and when it is used?

here i got a code where ManualResetEvent is used but i just do not understand what it does?

here is the code

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();
  }

  // ...
} 

what is the meaning of _complete.WaitOne(); & _complete.Set(); ?

can anyone give me small sample code where ManualResetEvent class usage will be there.

looking for good discuss and usage of ManualResetEvent ? thanks

like image 673
Thomas Avatar asked Mar 27 '13 10:03

Thomas


People also ask

What is ManualResetEvent?

ManualResetEvent is used for send signals between two or more threads. Multiple threads can enter into a waiting/blocking state by calling the WaitOne method on ManualResetEvent object. When controlling thread calls the Set method all the waiting threads are unblocked and free to proceed.

What is ManualResetEvent and AutoResetEvent in C#?

The ManualResetEvent is the door, which needs to be closed (reset) manually. The AutoResetEvent is a tollbooth, allowing one car to go by and automatically closing before the next one can get through.


2 Answers

I suggest you to read the "remarks" section of the MSDN page of ManualResetEvent which is pretty clear about the usage of this class.

To answer your specific question, the ManualResetEvent is used to simulate a synchronous call to Download even if it's asynchronous. It calls the async method and blocks until the ManualResetEvent is signaled. The ManualResetEvent is signaled within the event handler of the async event-based pattern. So basically it waits until the event is fired and the event handler is executed.

like image 162
ken2k Avatar answered Sep 24 '22 04:09

ken2k


To achieve deep understanding of any subject, I have to read the almost same information in other words. I've read the MSDN documentation about the ManualResetEvent, it was good I almost got to understand it, but this link helped me to understand it well:

http://dotnetpattern.com/threading-manualresetevent


VERY Simple explanation

If the current thread calls the WiatOne() method, it will be waiting(so stop doing anything) until any other thread calls the Set() method.

There is another overload for the WaitOne, is the WaitOne(TimeSpan). This is almost the same as the above, but if for eaxample give 5 seconds time to this method, the current thread will be waiting for other thread to call the Set() method for 5 seconds and if no one called Set(), it calls it automatically and contunie the work.

like image 23
koviroli Avatar answered Sep 26 '22 04:09

koviroli