在 WinRT 中优雅地处理异步任务取消
Windows 8 WinRT 的异步任务管理虽然功能强大,但在取消任务时却带来了挑战。 一个常见问题是 CancelNotification
方法触发,但任务继续执行,导致任务状态错误地标记为“已完成”而不是“已取消”。
解决方案:有效利用CancellationToken
解决此问题的关键在于正确实现CancellationToken
并遵守基于任务的异步模式(TAP)指南。 这涉及到将 CancellationToken
传递给每个可取消的方法,并定期检查这些方法中的状态。
修订后的代码示例:
这个改进的代码片段演示了 CancellationToken
的正确使用:
<code class="language-csharp">private async Task TryTask() { CancellationTokenSource source = new CancellationTokenSource(); source.CancelAfter(TimeSpan.FromSeconds(1)); Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token); try { // A canceled task will throw an exception when awaited. await task; } catch (OperationCanceledException) { // Handle cancellation gracefully. } } private int slowFunc(int a, int b, CancellationToken cancellationToken) { for (int i = 0; i < 1000000; i++) { cancellationToken.ThrowIfCancellationRequested(); // Check for cancellation // ... your long-running operation ... } return a + b; }</code>
这个修改后的 slowFunc
方法在其循环中合并了 cancellationToken.ThrowIfCancellationRequested()
检查。 如果请求取消,则会抛出 OperationCanceledException
,有效地停止任务并将其状态正确设置为“已取消”。 TryTask
方法现在包含一个 try-catch
块来处理此异常。
结果:
这种方法确保任务在取消时完全停止,提供准确的任务状态报告并防止意外的后台执行。 正确的异常处理进一步增强了健壮性。
以上是如何在Windows 8 Winrt中正确取消异步任务?的详细内容。更多信息请关注PHP中文网其他相关文章!