.Net Core 中使用 CancellationToken 的最佳实践

在本教程中,我们将了解 CancellationToken 以及如何使用它。

在以前,当我们有时间执行诸如耗时的 DB 调用、耗时的 HTTP 调用等操作时,我们没有选择取消它。

在应用程序中使用 CancellationToken 可带来多种好处,尤其是在改善响应能力、资源管理和用户体验方面。以下是一些主要优势:

**1. 提高响应能力**

用户体验:可以取消长时间运行的任务的应用程序可以快速响应用户操作,例如取消文件上传或下载,从而提供更好的用户体验。

实时调整:用户可以调整他们的操作(例如,停止搜索操作),而无需等待当前操作完成。

**2.资源管理**

高效利用资源:取消不必要的操作可避免浪费 CPU、内存和其他资源。这对于资源在众多用户之间共享的服务器端应用程序尤其重要。

数据库连接:在数据库操作中,使用 CancellationToken 可以释放原本被长时间运行的查询所占用的数据库连接。

**3.可扩展性**

处理高负载:应用程序可以通过取消不再需要的操作来更优雅地处理高负载,从而释放资源以处理新的传入请求。

并发控制:有效的取消有助于管理并发任务,确保将资源分配给最关键的操作。

**4. 错误处理和稳定性**

优雅关闭:当应用程序需要关闭或重新启动时,CancellationToken 允许优雅终止正在进行的操作,从而降低数据损坏或状态不一致的风险。

防止死锁:通过取消耗时过长的操作,可以减少死锁和其他并发问题的可能性。

**5. 超时实现**

自动超时:使用 CancellationTokenSource.CancelAfter 实现超时可以自动取消超过指定持续时间的任务,确保您的应用程序保持响应。

**6. 任务协调**

合作取消:CancellationToken 允许合作取消,其中操作定期检查令牌以查看是否请求取消,从而允许操作清理并正常终止。

链接取消令牌:您可以将多个 CancellationTokenSource 实例链接在一起,以同时取消多个操作,从而简化复杂任务的协调。

**7.简化代码维护**

标准模式:使用 CancellationToken 为任务取消建立标准模式,使代码更易于理解和维护。

一致处理:它提供了一种一致的方式来处理应用程序不同部分的取消,从用户发起的取消到自动超时和应用程序关闭。

**示例用例**

**Web 应用程序**:取消不再需要的数据库查询、文件上传/下载和 API 调用。

**桌面应用程序**:允许用户取消长时间运行的操作,如图像处理或数据分析。

**移动应用程序**:通过取消不再需要的后台操作来延长电池寿命。

**云服务**:通过响应扩展事件或维护窗口取消操作来有效地管理资源。

下面是如何使用 CancellationToken 取消正在进行的操作的简化示例:

public async Task LongRunningOperationAsync(CancellationToken cancellationToken)
{
    for (int i = 0; i < 100; i++)
    {
        // Periodically check if cancellation is requested
        cancellationToken.ThrowIfCancellationRequested();

        // Simulate some work
        await Task.Delay(100);
    }
}

public async Task MainAsync()
{
    using var cts = new CancellationTokenSource();

    // Cancel the operation after 2 seconds
    cts.CancelAfter(TimeSpan.FromSeconds(2));

    try
    {
        await LongRunningOperationAsync(cts.Token);
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine("Operation was canceled.");
    }
}

点击此链接查看完整教程