2012-12-05 4 views
13

Ich habe mich gefragt,neues AutoResetEvent (True) Verwendungen in C#?

Warum würde ich jemals eine true im Ctor von AutoResetEvent übergeben möchten?

Ich erstelle ein waitHandle, so dass jeder, der WaitOne() anrufen wird tatsächlich warten.

Wenn ich es mit einem true instanziiere, wird es sein, als ob es sofort signalisiert wurde - das ist wie ein normaler Fluss ohne zu warten.

EventWaitHandle _waitHandle = new AutoResetEvent (false); 

void Main() 
{ 
    new Thread (Waiter).Start(); 
    Thread.Sleep (1000);     
    _waitHandle.Set();      

Console.ReadLine(); 
} 
    void Waiter() 
    { 
    Console.WriteLine ("AAA"); 
    _waitHandle.WaitOne();     
    Console.WriteLine ("BBBB"); 
    } 

Ausgang:

AAA...(delay)...BBB 

Wechsel zu: EventWaitHandle _waitHandle = new AutoResetEvent (true); und der Ausgang wird sein:

AAABBB 

Frage:

  • Warum sollte ich jemals wollen um dies zu tun ? (true übergeben)?

Antwort

9

würde das Szenario, dass der Faden ersten sein, die WaitOne durch, ohne zu blockieren passieren sollte sofort aufruft.

Überprüfen Sie die Silverlight documentation for AutoResetEvent (seltsamerweise der Doc ist nicht das Gleiche auf der .NET-Versionen):

Angabe true für initialState eine AutoResetEvent in erzeugt der signalisierten Zustand. Dies ist nützlich, wenn Sie der erste Thread mögen, dass wartet auf die AutoResetEvent sofort freigegeben werden, ohne blocking „

+1

Wort "release" ist sehr verwirrend Es scheint, wie Sie Thread CPU-Zeit-Scheibe veröffentlichen, Aber Sie lassen es tatsächlich weiterarbeiten nach '.WaitOne()' call. – newprint

+0

Sie haben Recht, es ist verwirrend. Ich habe einen Kommentar auf dieser Dokumentation Seite hinzugefügt. – jeroenh

7

Es gibt eine gute Erklärung hier:.. Signaling with Event Wait Handles

paraphrasieren, das Warten Griff wie ein Drehkreuz, bei dem die Anrufer von WaitOne wie eine Reihe von Personen sind, die am Drehkreuz Schlange stehen Jedes Mal, wenn Set aufgerufen wird, erlaubt das Drehkreuz eine Person durch (normalerweise in der Reihenfolge, in der sie sich anstellten, aber manchmal nicht wegen OS-Macken)

Wenn es mit 'true' aufgebaut ist, dann ist das Drehkreuz bereits geöffnet, aber nur für eine Person, so dass der erste Anrufer von WaitOne sofort "durchgelassen" wird, aber alle nachfolgenden Anrufer müssen sich noch anstellen.

Offensichtlich nichts davon wäre anwendbar, wenn Sie nur einen Aufrufer von WaitOne haben, und so wäre die 'wahr' Option strittig.

1

Sicher.

Eine Voraussetzung - ein Thread X muss beim Start der App und alle 10 Sekunden danach ausgeführt werden. Ein zeitgesteuertes WaitForSingleObject (myARE, 10000) würde den Job erledigen. Die Initialisierung des ARE auf 'true' würde sicherstellen, dass der Thread beim Start ausgeführt wird.

Edit:.

myARE.WaitOne(10000); 

Sorry - ich aus C# Modus in WINAPI fiel, kurz :(

+0

Danke @jeroenh - Ich habe versucht, den Code-Block selbst hinzuzufügen mein ISP agiert heute wieder, DNS up/down mit Unterbrechungen :( –