2017-04-17 84 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

当您运行的代码,检查是否取消之前和之后挂起,并在两者之间。这样,如果在操作过程中被取消,则不会执行下一个分派器功能。

 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

Eh。没有?不是真的。但它是在睡眠之后。所以这并不重要。为什么不安全。这是4行代码。而且你甚至不会进入下一个循环。 –