7

ho una classe che genera vari compiti che possono funzionare a tempo indeterminato. Quando questo oggetto è disposto, voglio interrompere quelle attività da eseguire.compiti Annullamento del metodo Dispose

È questo l'approccio corretto:

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(); 
     } 
    } 
} 

risposta

12

Sei sulla strada giusta. Tuttavia, vorrei suggerire aspettando il compito di terminare prima di ritornare dal metodo Dispose, al fine di evitare condizioni di gara in cui l'attività continua a funzionare dopo che l'oggetto è stato eliminato. Disponi anche il 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

Ottima risposta - grazie. Una domanda: perché disponi del compito? – davenewza

+2

Solo perché è sicuro farlo, dal momento che è garantito che l'attività sarebbe terminata da allora. Ma [non si ha realmente bisogno di] (http://blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx). – Douglas

+0

Ok bene. Grazie per la lettura. – davenewza