是否可以在没有CancellationToken的情况下取消C#任务?

我需要取消返回任务的API调用,但它不会将CancellationToken作为参数,我不能添加一个。

我该如何取消该任务?

在这种特殊情况下,我正在使用带有Geocoder对象的Xamarin.Forms。

IEnumerable positions = await geo.GetPositionsForAddressAsync(address); 

这个电话有时需要很长时间。 对于我的一些用例,用户可以只导航到另一个屏幕,并且不再需要该任务的结果。

我还担心我的应用程序会进入hibernate状态,并且没有停止长时间运行的任务,或者任务完成并且需要不再有效的代码。

我读到的关于这样做的最好的是来自Stephen Toub的“与.NET并行编程”博客 。

基本上你创建自己的取消’重载’:

 public static async Task WithCancellation( this Task task, CancellationToken cancellationToken) { var tcs = new TaskCompletionSource(); using(cancellationToken.Register( s => ((TaskCompletionSource)s).TrySetResult(true), tcs)) if (task != await Task.WhenAny(task, tcs.Task)) throw new OperationCanceledException(cancellationToken); return await task; } 

然后使用try / catch来调用异步函数:

 try { await op.WithCancellation(token); } catch(OperationCanceledException) { op.ContinueWith(t => /* handle eventual completion */); … // whatever you want to do in the case of cancellation } 

真的需要阅读他的博客post……

简而言之……不可能取消不尝试观察CancellationToken的ac#任务,至少在你所指的上下文中是这样。 (例如,结束应用程序,会这样做)

Cancellation中的链接讨论了如何利用取消令牌的各种模式,但由于您正在处理您无法控制的库,因此您无能为力。