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

偉大な回答 - ありがとう。 1つの質問:なぜあなたはその仕事を処分しますか? – davenewza

+2

タスクが終了したことが保証されているので、そうするのが安全だからです。しかし、[あなたは本当にする必要はありません](http://blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx)。 – Douglas

+0

よかったです。読んでいただきありがとうございます。 – davenewza

関連する問題