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

Eh。いいえ?あんまり。しかし、それは眠った後です。それは本当に重要ではありません。なぜ安全でないのかそれは4行のコードです。そして、あなたは次のループに入ることさえありません。 –

関連する問題