Korrekter Weg, um den Start einer Aufgabe zu verzögern
Möchte ich so planen Sie einen task zu starten, in x-ms und in der Lage sein, um Sie abzubrechen, bevor es beginnt (oder erst am Anfang der Aufgabe).
Der erste Versuch wäre so etwas wie
var _cancelationTokenSource = new CancellationTokenSource();
var token = _cancelationTokenSource.Token;
Task.Factory.StartNew(() =>
{
token.ThrowIfCancellationRequested();
Thread.Sleep(100);
token.ThrowIfCancellationRequested();
}).ContinueWith(t =>
{
token.ThrowIfCancellationRequested();
DoWork();
token.ThrowIfCancellationRequested();
}, token);
Aber ich fühle mich wie es sollte eine bessere Weise, als wäre dies ein thread, während in den Schlaf, während dessen könnte es abgebrochen werden.
Was sind meine anderen Optionen?
InformationsquelleAutor der Frage Bruno Lopes | 2011-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie Damien_The_Unbeliever erwähntdie Async CTP umfasst
Task.Delay
. Zum Glück haben wir Reflektor:InformationsquelleAutor der Antwort Ohad Schneider
Da .NET 4.5 hat der jetzt veröffentlicht wurde, gibt es eine sehr einfache integrierte Weise zu verzögern, eine Aufgabe: benutzen Sie einfach
Aufgabe.Delay()
. hinter den kulissen, es verwendet die Implementierung, die ohadsc dekompiliert.InformationsquelleAutor der Antwort skolima
Die richtige Antwort in der Zukunft wohl
Task.Delay
. Allerdings ist dies derzeit nur durch die Async CTP (und in der CTP-Version, es ist auf TaskEx eher als Aufgabe).Leider, weil es nur in CTP, gibt es nicht viele gute links zur Dokumentation für Sie.
InformationsquelleAutor der Antwort Damien_The_Unbeliever
Blick auf die TaskFactoryExtensions_Delayed in "Parallele Programmierung mit .NET 4 Proben".
InformationsquelleAutor der Antwort jyoung
Habe ich noch nicht getestet, aber hier ist ein first-pass-auf-wrapper-Methoden zum erstellen einer anfänglichen 'Delay' - Aufgabe oder fortsetzen nach einer Verzögerung. Wenn Sie Probleme feststellen, fühlen Sie sich frei, zu korrigieren.
InformationsquelleAutor der Antwort Dan Bryant
Können Sie Token.WaitHandle.WaitOne(int32 milliseconds) überlast-Methode geben Sie die Anzahl von Millisekunden zu warten, für Ihre Aufgabe. Aber wichtige Unterschied zwischen Thread.Sleep(xxx) und Token.WaitHandle.WaitOne(xxx), die später blockiert thread, bis die angegebene Zeit verstrichen oder das token freigegeben wurde.
Hier ist ein Beispiel
InformationsquelleAutor der Antwort Vlad Bezden