7

我有一個類,它產生可以無限期運行的各種任務。當這個對象被丟棄時,我想停止這些任務的運行。取消Dispose方法中的任務

這是正確的做法:

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

回答

12

你在正確的軌道上。但是,我建議等待任務在從Dispose方法返回之前終止,以避免任務在對象被處置後繼續運行的競爭條件。還處置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

很好的答案 - 謝謝。一個問題:你爲什麼要處置這個任務? – davenewza

+2

僅僅因爲這樣做是安全的,因爲你可以保證當前任務已經結束。但[你並不需要](http://blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx)。 – Douglas

+0

好吧。感謝您的閱讀。 – davenewza