2016-05-14 6 views
-1

Wie kann ich Aufgaben in der Liste zu stoppen, wieder zu realisieren.Aufgabenliste Wie kann ich die Aufgabe stoppen C#

for (f = 0; f < 3; f++) 
{ 
    list1.ForEach(t => t.Start()); 
    list1.ForEach(t => t.Wait()); 

    Task.WaitAll(list1.ToArray()); 

    //here is problem 
    list1.ForEach(t => t.Cancel()); 
} 
+0

Bitte erläutern Sie ein bisschen mehr. Ich kann deine Frage nicht verstehen. – NineBerry

+0

Ich muss diese Schleife realisieren, aber nach einer Ausführung bekomme ich Fehler "Fehler 'System.Threading.Tasks.Task' enthält keine Definition für 'IsCancellationRequested' und keine Erweiterungsmethode 'IsCancellationRequested' akzeptiert ein erstes Argument von type 'System.Threading.Tasks.Task' könnte gefunden werden (fehlt eine using-Direktive oder eine Assembly-Referenz?) " – Quicki

Antwort

1

Die Aufgabe kann sich nicht selbst abbrechen. Aus dem Code, den du gezeigt hast, siehst du so aus, als hättest du eine Aufgabenliste. Wenn Sie dann die Aufgabe löschen können, wollen, während der Code ausgeführt wird, haben Sie eine CancellationTokenSource zu schaffen und eine CancellationToken an die Aufgabe des Konstruktor übergeben:

list1.Add(new Task<string>((x) => { return x.ToString(); }, cancelationTokenSource.Token)); 

(In dem obigen Code ich die Aufgabe angenommen wird erwartet, Rückkehr eine Zeichenfolge, aber es wird für jede Aufgabe arbeiten)

Dann, wenn Sie die Aufgabe, die Sie die cancelationTokenSource verwenden absagen müssen.

cancelationTokenSource.Cancel(); 

Dies wird die Aufgabe beenden. Was Sie dann an der Aufgabe selbst tun können, ist zu überprüfen, ob es abgebrochen wurde:

list1.ForEach(t => 
{ 
    if (t.IsCanceled) 
    { 

    } 
} 

Hoffe, dass hilft. Meine Antwort basiert auf meiner Interpretation Ihres Codes, da in der Frage nicht viel erklärt wurde. Wenn Sie weitere Informationen benötigen, klären Sie bitte.

+0

Kann ich Aufgaben wie hier hinzufügen? 'Liste list1 = neue Liste (); für (int i = 0; i <5; i ++) { list1.Add (neue Aufgabe (actionA)); } ' – Quicki

+0

Eigentlich wird' cancelationTokenSource.Cancel' die Aufgabe nicht in 'Thread.Abort' Weise abbrechen - stattdessen wird die Aufgabe angewiesen, zu stoppen, wenn _and if_ die Aufgabe ihre' CancellationToken' fragt, ob sie die Aufgabe stoppen soll nächstes Mal. Außerdem muss der Task sein "CancellationToken" kennen, indem er es in "Task.Run" übergibt. Sein Status wird dann "Canceled" anstatt "Failed", wenn das Token eine "TaskCanceledException" auslöst ... – Haukinger

+0

Es besteht keine Notwendigkeit für eine Stornierung in diesem Szenario, da alle Aufgaben aufgrund des Aufrufs von WaitAll() abgeschlossen wurden; –

0

Paar vorneweg:

Sie nicht die Aufgabe Konstruktor verwenden. Verwenden Sie Task.Run() siehe http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx

Aber in Ihrem Fall bin ich nicht einmal sicher, dass Sie überhaupt Aufgaben verwenden sollten. Für Schleifen gibt es PLINQ.

dieses Stück Code in einer

Schleife
list1.ForEach(t => t.Start()); 
list1.ForEach(t => t.Wait()); 

im Grunde ist es eine Aufgabe starten macht laufen, und dann darauf warten, bevor die nächste Schleife beginnt.

Ich empfehle die Verwendung von Parallel.ForAll(), wenn Sie mehrere CPU gebundene Operationen benötigen, um in der Schleife abzuschließen. Wenn es IO-gebunden ist, verwenden Sie async/erwarten Sie

Dann versuchen Sie, die Aufgaben abzubrechen, nachdem Sie darauf gewartet haben, dass sie abgeschlossen sind. Das macht keinen Sinn oder ich verstehe nicht gut genug, was du erreichen willst.

Lassen Sie uns nun über das Abbrechen der Arbeit sprechen. Sie benötigen etwas in der Art:

var cts = new CancellationTokenSource(); 
var ct = cts.Token; 

Stellen Sie die CancellationToken ct den Aufgaben in list1. Rufen Sie dann cts.Cancel() auf, um alle Tasks abzubrechen, denen das Token zugewiesen wurde. Zum Beispiel Task.Run(asyncWork, ct) wo asyncWork die Aktion ist, die Sie ausführen möchten.

In der Aktion asyncWork prüfen Löschungs ct.ThrowIfCancellationRequested();

Siehe https://blogs.msdn.microsoft.com/andrewarnottms/2014/03/19/recommended-patterns-for-cancellationtoken/

Sie müssen mit mehr über die Aufgaben, die Sie in list1 für eine bessere Beratung setzen bereitzustellen.

Verwandte Themen