我正在考虑为AsyncUI和WinRT XAML Toolkit库中的等待扩展方法添加取消支持。看起来基本的Task类没有内置的Cancel()方法或事件,并且依赖于我的任务需要定期检查的取消令牌。我认为在我的UI场景中没有意义,因为我的任务是使用TaskCompletionSource生成的,我想取消UI线程上的任务以响应事件,而不是在线程池线程上运行循环并检查令牌
当UI事件发生时,我的任务当前已完成 - 如故事板完成或点击按钮,所以如果我想支持取消 - 我需要通过取消订阅事件并进行其他清理(例如停止)来响应取消请求动画。
我正在考虑创建某种CancellableUITask基类而不是使用TaskCompletionSource,所以我可以公开我的任务的使用者可以调用的Cancel()方法(例如,为了响应按钮点击而停止等待的动画)和我的storyboard awaiter任务可以覆盖以执行清理的虚拟OnCancellationRequested()方法之类的东西。
有意义吗?什么是完成我在这里描述的最佳方式?
答案 0 :(得分:1)
您的任务不需要定期检查取消 - 这只是最常见的做事方式。如果您的任务是事件驱动的,那么您可以针对取消时将调用的CancellationToken
注册处理程序。请参阅CancellationToken.Register
。
所以你的代码看起来像这样:
public Task DoSomethingAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var tcs = new TaskCompletionSource();
if (cancellationToken.CanBeCanceled)
{
// register for notification of cancellation
cancellationToken.Register(...);
}
// set up other handlers and what-not
return tcs.Task;
}