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



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

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

我正在考虑创建某种CancelleableUITask基类,而不是使用TaskCompletionSource,这样我就可以公开一个Cancel()方法,我的任务的使用者可以调用该方法(例如,为了响应按钮点击而停止等待的动画),以及一个类似于虚拟OnCancellationRequested()方法的方法,我在情节提要中的任务可以覆盖该方法来执行清理。

这有道理吗?实现我在这里所描述的目标的最佳方式是什么?

您的任务不需要定期检查是否取消,这只是最常见的做法。如果您的任务是事件驱动的,那么您可以针对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;
}

最新更新