首页 >后端开发 >C++ >如何在 WinRT 中可靠地取消可等待的任务?

如何在 WinRT 中可靠地取消可等待的任务?

Linda Hamilton
Linda Hamilton原创
2025-01-26 12:51:09768浏览

How Can I Reliably Cancel an Awaitable Task in WinRT?

解决 WinRT 中不可靠的任务取消问题

使用 CancelNotification 停止 WinRT 任务可能不可靠;该方法可能看起来成功,但任务仍在继续运行。 尽管尝试取消,这通常会导致任务状态为已完成。

强大的取消方法

解决方案在于了解 .NET 取消和基于任务的异步模式 (TAP)。 TAP 建议在异步方法中使用 CancellationToken。 关键的一步是将 CancellationToken 传递给每个可取消的方法,并在这些方法中合并定期检查。

改进的代码示例:

此修订后的代码演示了使用 await 可靠的任务取消:

<code class="language-csharp">private async Task TryTask()
{
  var source = new CancellationTokenSource();
  source.CancelAfter(TimeSpan.FromSeconds(1));
  var task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token);

  try
  {
    // Await the task; an exception is thrown if cancelled.
    await task;
  }
  catch (OperationCanceledException)
  {
    // Handle cancellation gracefully.
    Console.WriteLine("Task cancelled successfully.");
  }
}

private int slowFunc(int a, int b, CancellationToken cancellationToken)
{
  string someString = string.Empty;
  for (int i = 0; i < 1000000; i++)
  {
    someString += i.ToString(); // Simulate long-running operation
    cancellationToken.ThrowIfCancellationRequested();
  }
  return a + b;
}</code>

此代码使用 CancellationToken 如下:

  • 异常处理: await task 如果任务被取消,则抛出 OperationCanceledException。 这个异常被捕获并处理。
  • 定期取消检查:cancellationToken.ThrowIfCancellationRequested()slowFunc定期检查取消请求。
  • 优雅取消: 如果检测到取消,ThrowIfCancellationRequested 会抛出异常,并在调用堆栈中向上传播取消信号。

此方法可确保在 WinRT 中可靠地取消 awaited 任务,防止后台进程并提供更强大的解决方案。

以上是如何在 WinRT 中可靠地取消可等待的任务?的详细内容。更多信息请关注PHP中文网其他相关文章!

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