2017-04-17 1 views
2

작업을 실행 중입니다. 창을 닫을 때 취소 토큰 원본을 사용하여 작업을 취소하려고합니다. 창을 닫을 때마다 오류가 발생하지 않습니다. 가끔씩 만. 난 당신이 코드를 실행하면 취소가 이전과 이후에 출원되어 있는지 확인하고, 그 사이에작업이 취소되었습니다.

enter image description here

private CancellationTokenSource dotIndicatorTokenSource; 
    private void BlinkDotIndicator() 
    { 

     var halfPeriod = 200; 

     dotIndicatorTokenSource = new CancellationTokenSource(); 
     Task.Factory.StartNew(() => 
     { 
      while (true) 
      { 
       Dispatcher.Invoke(() => 
       { 
        connectionIndicatorDotImg.Visibility = Visibility.Hidden; 
       }); 
       Thread.Sleep(halfPeriod); 

       Dispatcher.Invoke(() => 
       { 
        connectionIndicatorDotImg.Visibility = Visibility.Visible; 
       }); 

       Thread.Sleep(halfPeriod); 

       if (dotIndicatorTokenSource.IsCancellationRequested) 
       { 
        break; 
       } 

      } 
     }, dotIndicatorTokenSource.Token); 

    } 


    private void Window_Closing(object sender, CancelEventArgs e) 
    { 
     if (dotIndicatorTokenSource != null) 
      dotIndicatorTokenSource.Cancel(); 
    } 

답변

2

무엇입니까 오류에서 봐 주시기 바랍니다. 그러면 조작 중에 취소 된 경우 다음 Dispatcher 기능을 실행하지 않습니다.

 while (true) 
     { 
      if (dotIndicatorTokenSource.IsCancellationRequested) 
      { 
       break; 
      } 

      Dispatcher.Invoke(() => 
      { 
       connectionIndicatorDotImg.Visibility = Visibility.Hidden; 
      }); 
      Thread.Sleep(halfPeriod); 

      if (dotIndicatorTokenSource.IsCancellationRequested) 
      { 
       break; 
      } 

      Dispatcher.Invoke(() => 
      { 
       connectionIndicatorDotImg.Visibility = Visibility.Visible; 
      }); 

      Thread.Sleep(halfPeriod); 

      if (dotIndicatorTokenSource.IsCancellationRequested) 
      { 
       break; 
      } 

     } 
+0

아. 그 논리에 이어, 결국 취소를 확인해야 할 필요가 있습니까? –

+0

어. 아니? 그렇지 않아. 하지만 잠이 든다. 그래서 그것은별로 중요하지 않습니다. 안전하지 않으시겠습니까? 그것은 4 줄의 코드입니다. 그리고 당신은 다음 단계로 넘어 가지 않습니다. –

관련 문제