是否可以在没有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中的链接讨论了如何利用取消令牌的各种模式,但由于您正在处理您无法控制的库,因此您无能为力。
- 如何使用CallerMemberName属性更改ILoggerFacade实现以跟踪调用方法?
- 默认事件添加/删除实现
- 如何在卸载时通过Wix删除生成的文件夹和文件?
- Azure Active Directory Graph Client 2.0 – 上下文当前未跟踪实体
- LogicalOperationStack与.Net 4.5中的异步不兼容
- 安装文件的位置 – Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5
- 动态操作员解析
- 在.net 4.5中有类似dbgeometry makevalid的东西吗?
- Directory.GetCurrentDirectory()根据命令行参数返回不同的结果