任务被取消
问题描述:
我正在运行一项任务。关闭窗口时,我正在尝试使用取消标记来源取消任务。每当窗口关闭时都不会发生错误。只是有时。请看一看错误我得到任务被取消
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();
}
答
当您运行的代码,检查是否取消之前和之后挂起,并在两者之间。这样,如果在操作过程中被取消,则不会执行下一个分派器功能。
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;
}
}
哦,我明白了。遵循这个逻辑,是否真的有必要最终检查取消? –
Eh。没有?不是真的。但它是在睡眠之后。所以这并不重要。为什么不安全。这是4行代码。而且你甚至不会进入下一个循环。 –