在 C# 中有效处理任务取消
CancellationToken.CancelNotification
方法本身并不能停止正在运行的任务;它只是表示取消。 为了确保任务在取消时干净地终止,您必须主动将取消处理合并到任务的逻辑中。
利用基于任务的异步模式 (TAP)
最有效的方法是持续使用 TAP 和 CancellationToken
:
CancellationToken
: 将 CancellationToken
参数合并到每个可以取消的方法中。cancellationToken.ThrowIfCancellationRequested()
定期检查令牌的状态。 如果检测到取消,则抛出异常以停止执行。使用 TAP 修订的代码示例
这个改进的示例演示了正确的取消处理:
<code class="language-csharp">private async Task TryTask() { using (var source = new CancellationTokenSource()) { source.CancelAfter(TimeSpan.FromSeconds(1)); try { Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token); int result = await task; // Await will re-throw any exceptions. Console.WriteLine($"Task completed successfully: {result}"); } catch (OperationCanceledException) { Console.WriteLine("Task cancelled successfully."); } } } 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>
说明:
using
声明: 即使发生异常,也确保 CancellationTokenSource
得到正确处置。try-catch
块: 处理 OperationCanceledException
抛出的 cancellationToken.ThrowIfCancellationRequested()
,提供干净的取消处理。slowFunc
: cancellationToken.ThrowIfCancellationRequested()
调用策略性地放置在循环中,允许频繁的取消检查。 这可以防止请求取消后不必要的工作。这种修改后的方法可保证任务在请求取消时立即停止,从而防止资源泄漏并提高整体应用程序响应能力。
以上是在C#中取消时,如何正确停止任务?的详细内容。更多信息请关注PHP中文网其他相关文章!