7

Ich habe eine Klasse, die verschiedene Aufgaben hervorbringt, die unbegrenzt ausgeführt werden können. Wenn dieses Objekt entsorgt wird, möchte ich die Ausführung dieser Aufgaben stoppen.Abbrechen von Aufgaben in der Dispose-Methode

Ist das der richtige Ansatz:

public class MyClass : IDisposable 
{ 
    // Stuff 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      queueCancellationTokenSource.Cancel(); 
      feedCancellationTokenSource.Cancel(); 
     } 
    } 
} 

Antwort

12

Sie auf dem richtigen Weg sind. Ich würde jedoch vorschlagen, auf die Beendigung der Aufgabe zu warten, bevor ich von der Methode Dispose zurückkomme, um Wettlaufbedingungen zu vermeiden, bei denen die Aufgabe fortgesetzt wird, nachdem das Objekt entsorgt wurde. Entsorgen Sie auch die CancellationTokenSource.

public class MyClass : IDisposable 
{ 
    private readonly CancellationTokenSource feedCancellationTokenSource = 
     new CancellationTokenSource(); 
    private readonly Task feedTask; 

    public MyClass() 
    { 
     feedTask = Task.Factory.StartNew(() => 
     { 
      while (!feedCancellationTokenSource.IsCancellationRequested) 
      { 
       // do finite work 
      } 
     }); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      feedCancellationTokenSource.Cancel(); 
      feedTask.Wait(); 

      feedCancellationTokenSource.Dispose(); 
      feedTask.Dispose(); 
     } 
    } 
} 
+0

Große Antwort - danke. Eine Frage: Warum verfügen Sie über die Aufgabe? – davenewza

+2

Nur weil es sicher ist, da Sie garantiert haben, dass die Aufgabe bis dahin beendet sein würde. Aber [Sie müssen nicht wirklich] (http://blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx). – Douglas

+0

Ok gut. Danke für das Lesen. – davenewza