如何在 await 中取消任务?
我正在玩这些 Windows 8 WinRT 任务,并尝试使用下面的方法取消任务,它在一定程度上是有效的。CancelNotification 方法确实被调用了,这让你以为任务被取消了,但在后台,任务一直在运行,然后在任务完成后,任务的状态始终是已完成,从未取消。有没有办法在任务取消时完全停止任务?
private async void TryTask()
{
CancellationTokenSource source = new CancellationTokenSource();
source.Token.Register(CancelNotification);
source.CancelAfter(TimeSpan.FromSeconds(1));
var task = Task<int>.Factory.StartNew(() => slowFunc(1, 2), source.Token);
await task;
if (task.IsCompleted)
{
MessageDialog md = new MessageDialog(task.Result.ToString());
await md.ShowAsync();
}
else
{
MessageDialog md = new MessageDialog("Uncompleted");
await md.ShowAsync();
}
}
private int slowFunc(int a, int b)
{
string someString = string.Empty;
for (int i = 0; i < 200000; i++)
{
someString += "a";
}
return a + b;
}
private void CancelNotification()
{
}
147
3
请阅读 取消(.NET 4.0 中引入,此后基本保持不变)和 基于任务的异步模式,其中提供了如何将
CancellationToken
与async
方法一起使用的指南。简而言之,您需要向每个支持取消的方法传递一个
CancellationToken
,并且该方法必须定期检查它。或者,为了避免修改
slowFunc
(例如,你无法访问源代码):您也可以使用 https://github.com/StephenCleary/AsyncEx 中的扩展方法,这样看起来就很简单了:
我只是想对已经被接受的答案做一些补充。 我在这一点上卡住了,但我在处理完成事件时走的是另一条路。 我没有运行 await,而是在任务中添加了一个完成处理程序。
事件处理程序如下所示
有了这个路由,所有的处理工作都已为您完成,当任务被取消时,它只会触发事件处理程序,您可以在那里看到任务是否被取消。