2013-12-12 37 views
0

我有一个async的方法,我希望能够取消当前所谓在任务<TResult>

 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

找不到任何示例方法,我不会得到令牌,所以这是行不通的。

回答

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这样的调用结果和任务被取消,它会抛出一个异常,这是你将如何支持该路径。

相关问题