2016-05-30 8 views
0

Ich habe eine Funktion, die 35 Aufgabe für Berechnung von Rechnungen generieren.Aufgabe in asp.net abbrechen

Mein Code:

public int CalcGroup() 
     { 
      try 
      { 
       CancellationTokenSource cts = new CancellationTokenSource(); 
       CancellationToken ct = cts.Token; 

       for (int i = 0; i < 35 ; i++) 
       { 

        var myTask = new Task<long>(() => CalcSingle(_personnelIds.Item1), ct, TaskCreationOptions.LongRunning); 
         myTask.Start(); 

       } 
      } 
      catch (Exception) 
      { 
       return 0; 
      } 
      return 1; 
     } 

"CalcSingle() ist eine weitere Funktion, die Aufgaben daran zu arbeiten." und meine Veranstaltung, die Aufgaben für annullieren:

protected void btnStopCalc_Click(object sender, EventArgs e) 
     {        
      CancellationTokenSource cts = new CancellationTokenSource(); 
      cts.Cancel(); 
     } 

Es ist nicht richtig

+3

Sie erstellen ein neues Objekt und rufen Cancel anstelle des aktuellen auf? –

+0

Ja, meine Funktion in der DAL-Schicht und Aufrufe von UI abbrechen. Ist das nicht möglich? –

+0

Sie müssen Cts speichern, wo Sie Cancel aufrufen können. Als ein Feld. Dann verwenden Sie keine neue CancellationTokenSource in Ihrem Klick-Handler, sondern verwenden stattdessen dieses Feld. –

Antwort

1

Ein Auszug aus MSDN arbeiten:

„A CancellationToken zwischen Threads kooperative Kündigung ermöglicht, Arbeit Threadpool Objekte oder Aufgabenobjekte Ein Objekt erstellt ein Storniertoken mithilfe einer CancellationTokenSource und übergibt dann das Stornierungs-Token an eine beliebige Anzahl von Threads oder Objekten, die s hould erhalten Kündigung. Mit dem Token kann keine Stornierung ausgelöst werden. Wenn das besitzende Objekt Cancel für die CancellationTokenSource aufruft, wird die IsCancellationRequested-Eigenschaft für jede Kopie des Löschungs-Tokens auf True festgelegt. Die Objekte, die die Benachrichtigung erhalten können reagieren, was auch immer Art und Weise ist angemessen.“

Der Punkt ist, dass Cancelling über ein Token nur setzt die‚IsCancelled‘Eigenschaft auf true, Ihr Code in‚CalcSingle‘muss abfragen Diese Eigenschaft wird nach allen logischen Schritten im Code ausgeführt und ordnungsgemäß beendet. Dies geschieht, weil .Net nicht weiß, ob Ihr Code etwas Kritisches tut, und wenn Sie eine Aufgabe willkürlich abbrechen, kann Ihre Ausführung in einem fehlerhaften Zustand bleiben. https://msdn.microsoft.com/en-us/library/dd997289(v=vs.110).aspx

und dies für eine gutes Beispiel dafür, wie man es für Aufgaben (TPL) macht: https://msdn.microsoft.com/en-us/library/dd997396(v=vs.110).aspx

Verwandte Themen