2009-05-07 7 views
0

Ich bin auf der Suche nach etwas nett und einfach. Zum Beispiel:Einfachster Weg, um Code zu einem bestimmten Zeitpunkt in. NET

RunAfter(3, delegate() { z = 5; }); // run after 3 seconds 
FnThatTakes5Seconds(); 

In meinen Fällen möchte ich einige Threading-Code testen und zu etwas in der Mitte eines anderen Funktionsaufruf passieren haben.

Antwort

0

Ich würde einen System.Threading.Timer verwenden, der nur einmal auslöst und sofort startet.

System.Threading.Timer _timer = new Timer(ProcessTimer, null, 3000, Timeout.Infinite); 
+0

Das funktioniert, aber es ist ein bisschen ausführlich. – BCS

+0

Wenn dies als Variable deklariert ist, wird dies wahrscheinlich nicht im Release-Modus funktionieren; Der Timer wird wahrscheinlich Müll gesammelt werden, bevor es ausgelöst wird. Sie müssen wahrscheinlich einen GC.KeepAlive (_timer) am Ende der Methode hinzufügen, um dies zu umgehen. –

+0

Und im Einklang mit Gregs Aussage eliminiert diese Art die Einfachheit eines einzelnen Funktionsaufrufs. Dies ist viel besser einmal in eine Methode eingekapselt und wiederverwendet. –

1
public static void RunAfter(int millisecondTimeout, 
    System.Threading.ThreadStart method) 
{ 
    System.Threading.Thread t = new System.Threading.Thread(() => 
    { 
     System.Threading.Thread.Sleep(millisecondTimeout); 

     method(); 
    }); 

    t.Start(); 
} 

Sie könnten dann tun

RunAfter(3000,() => z = 5;); 
+0

Ich hoffte irgendwie auf einen Standard Funktionsanruf – BCS

+0

Das ist, was Sie hier bekommen. Dafür gibt es keine eingebaute Funktion. Dies gibt Ihnen eine wiederverwendbare Funktion, die erfüllt, was Sie wollen. –

0

Sie auch ein Waithandle, bis ein Timeout in einem Background auftritt, warten nutzen könnten.

ManualResetEvent objResetEvent = new ManualResetEvent(); 
objResetEvent.WaitOne(timeout, ...); 
+0

Das gibt dir keinen parallelen Faden; Es blockiert nur den Hauptthread. –

+0

Ich habe vergessen, die Verwendung des Backgroundworker anzugeben –

Verwandte Themen