在任务<tresult> </tresult>中发送取消令牌

时间:2013-12-12 20:13:46

标签: c# task cancellation cancellation-token

我有一个async方法,我希望能够取消当前名为

的方法
        string html = await Html.WebClientRetryAsync(state);

我一直试图找出能够调用此方法的语法,并将其传递给CancellationToken。这是我到目前为止所尝试的内容。

        CancellationToken ct;
        Func<object, Task<string>> func = async (s) => await WebClientRetryAsync((string)s);
        Task<Task<string>> task = Task<Task<string>>.Factory.StartNew(func, state.Uri.AbsoluteUri, ct);
        string html = await task.Result;

我计划检查方法内部以查看是否在继续之前请求取消。我在documentation

中找不到任何示例

我所拥有的内容无法获得WebClientRetryAsync方法的令牌,因此无效。

1 个答案:

答案 0 :(得分:2)

如果底层异步方法不支持以任何方式取消,则根本没有任何方法可以取消它,就像How do I cancel non-cancelable async operations?中所讨论的那样。取消令牌取消后,您可以让代码继续执行,但如果底层异步操作无法被告知它应该停止,则无法停止它。

如果您只想在任务完成时想要一种移动方式,假设已达到超时,那么您可以使用这些扩展方法来添加该功能:

public static Task AddCancellation(this Task task, CancellationToken token)
{
    return Task.WhenAny(task, task.ContinueWith(t => { }, token))
        .Unwrap();
}
public static Task<T> AddCancellation<T>(this Task<T> task, 
    CancellationToken token)
{
    return Task.WhenAny(task, task.ContinueWith(t => t.Result, token))
        .Unwrap();
}

当然要意识到如果你await这样的调用结果并且任务被取消,它将抛出异常,这就是你支持这条路径的方式。