如何为异步UI任务添加取消支持?

时间:2012-09-11 19:25:53

标签: wpf silverlight task-parallel-library winrt-xaml async-await

我正在考虑为AsyncUIWinRT XAML Toolkit库中的等待扩展方法添加取消支持。看起来基本的Task类没有内置的Cancel()方法或事件,并且依赖于我的任务需要定期检查的取消令牌。我认为在我的UI场景中没有意义,因为我的任务是使用TaskCompletionSource生成的,我想取消UI线程上的任务以响应事件,而不是在线程池线程上运行循环并检查令牌

当UI事件发生时,我的任务当前已完成 - 如故事板完成或点击按钮,所以如果我想支持取消 - 我需要通过取消订阅事件并进行其他清理(例如停止)来响应取消请求动画。

我正在考虑创建某种CancellableUITask基类而不是使用TaskCompletionSource,所以我可以公开我的任务的使用者可以调用的Cancel()方法(例如,为了响应按钮点击而停止等待的动画)和我的storyboard awaiter任务可以覆盖以执行清理的虚拟OnCancellationRequested()方法之类的东西。

有意义吗?什么是完成我在这里描述的最佳方式?

1 个答案:

答案 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;
}