1

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

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

我正在考虑创建某种 CancellableUITask 基类而不是使用 TaskCompletionSource,因此我可以公开我的任务使用者可以调用的 Cancel() 方法(例如,停止等待的动画以响应按钮单击)等等就像我的故事板等待任务可以覆盖以执行清理的虚拟 OnCancellationRequested() 方法。

是否有意义?完成我在这里描述的内容的最佳方法是什么?

4

1 回答 1

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;
}
于 2012-09-11T20:13:59.433 回答