首页 >后端开发 >C++ >在C#中取消时,如何正确停止任务?

在C#中取消时,如何正确停止任务?

DDD
DDD原创
2025-01-26 12:36:10679浏览

How Can I Properly Stop a Task Upon Cancellation in C#?

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

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