首页 >后端开发 >C++ >如何在Windows 8 Winrt中正确取消异步任务?

如何在Windows 8 Winrt中正确取消异步任务?

DDD
DDD原创
2025-01-26 12:46:09455浏览

How Can I Properly Cancel Asynchronous Tasks in Windows 8 WinRT?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn