2011-03-14 1 views
1
static void Main(string[] args) 
    { 
     CancellationTokenSource cts = new CancellationTokenSource(); 

     ThreadPool.QueueUserWorkItem(o => DoWork(cts.Token, 100)); 

     Thread.Sleep(500); 

     try 
     { 
      cts.Token.Register(CancelCallback3); 
      cts.Token.Register(CancelCallback2); 
      cts.Token.Register(CancelCallback1); 



      cts.Cancel(false); 
     } 
     catch (AggregateException ex) 
     { 
      foreach (Exception curEx in ex.Data) 
      { 
       Trace.WriteLine(curEx.ToString());  
      } 

     } 

     Console.ReadKey(); 
    } 

    private static void CancelCallback1() 
    { 
     Trace.WriteLine("CancelCallback1 was called"); 
     throw new Exception("CancellCallback1 exception"); 
    } 


    private static void CancelCallback2() 
    { 
     Trace.WriteLine("CancelCallback2 was called"); 
     throw new Exception("CancellCallback2 exception"); 
    } 

    private static void CancelCallback3() 
    { 
     Trace.WriteLine("CancelCallback3 was called"); 
    } 

    private static void DoWork(CancellationToken cancellationToken, int maxLength) 
    { 
     int i = 0; 
     while (i < maxLength && !cancellationToken.IsCancellationRequested) 
     { 
      Trace.WriteLine(i++); 
      Thread.Sleep(100); 
     } 
    } 

출력은 (거짓) : 그 throwOnFirstException 매개 변수가 여기에 어떤 이해가되지 않습니다처럼CancellationTokenSource.Cancel

0 
1 
2 
3 
4 
CancelCallback1 was called 

내가 AggregateException을받을 것으로 예상 http://msdn.microsoft.com/en-us/library/dd321703.aspx에 따르면,이 보인다. 내 코드가 뭐가 잘못 됐어.

답변

3

AggregateException을 얻으려면 Task <> 클래스를 사용해야합니다. ThreadPool.QueueUserWorkItem() 대신 사용할 수 있습니다.

1

문제는 Visual Studio에서 강력한 디버깅 환경이 부족하다는 것입니다. VS 디버거 설정이 첫 번째 예외 발생시 중지되도록 설정되었습니다.

FYI CancellationTokenSource.Cancel (false)은 작업뿐만 아니라 ThreadPool에서도 잘 작동합니다.

관련 문제