解决 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 中可靠地取消 await
ed 任务,防止后台进程并提供更强大的解决方案。
以上是如何在 WinRT 中可靠地取消可等待的任务?的详细内容。更多信息请关注PHP中文网其他相关文章!