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