我有一个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
方法的令牌,因此无效。
答案 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
这样的调用结果并且任务被取消,它将抛出异常,这就是你支持这条路径的方式。