.NET Core中使用CancellationToken取消API请求

在.NET Core中,异步编程和取消操作是常见的需求。当我们需要取消一个正在进行的异步操作时,比如一个耗时的API请求,CancellationToken就显得尤为重要。CancellationToken是.NET中用于传递取消操作的信号的一个结构,它允许你在某个操作还未完成时请求取消。

CancellationToken简介

CancellationToken是.NET中的一个轻量级对象,用于传递取消操作的信号。当与CancellationTokenSource结合使用时,你可以在任何时候通过调用CancellationTokenSource.Cancel方法来提供取消信号。一旦CancellationTokenSource被取消,所有关联的CancellationToken都会被标记为已取消,然后传递给它的任何任务都应该尽快停止执行。

使用CancellationToken取消API请求

下面是一个使用CancellationToken来取消API请求的示例:

using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        using var cts = new CancellationTokenSource();
        var token = cts.Token;

        // 模拟一个可以被取消的异步API请求
        Task<string> apiRequest = MakeApiRequestAsync(token);

        // 假设一段时间后,我们决定取消请求
        await Task.Delay(2000); // 等待2秒
        cts.Cancel(); // 发送取消信号

        try
        {
            string result = await apiRequest; // 这里会抛出TaskCanceledException,因为我们已经取消了请求
            Console.WriteLine(result); // 这行代码实际上不会执行,因为上面的await会抛出异常
        }
        catch (TaskCanceledException)
        {
            Console.WriteLine("API请求被取消了");
        }
    }

    static async Task<stringMakeApiRequestAsync(CancellationToken token)
    {
        using var client = new HttpClient();
        // 假设我们有一个需要很长时间的API请求,为了演示,我们使用一个会延迟5秒的请求来模拟
        await Task.Delay(5000, token); // 如果在5秒内请求被取消,这里会抛出TaskCanceledException
        return await client.GetStringAsync("https://api.example.com/data"); // 假设的API地址,仅用于演示
    }
}

在上面的示例中,我们创建了一个CancellationTokenSource实例,并使用其Token属性生成了一个CancellationToken。然后,我们将这个token传递给了一个模拟的异步API请求方法MakeApiRequestAsync。稍后,我们决定取消这个请求,于是调用了CancellationTokenSource.Cancel方法来提供取消信号。当MakeApiRequestAsync方法中的Task.Delay检测到取消信号时,它会抛出一个TaskCanceledException,从而中断请求的继续执行。

注意事项和最佳实践

  1. 尽早检查取消:在你的异步方法中,你应该尽早并经常检查取消标志。这可以确保你的代码在收到取消信号时能够迅速响应。
  2. 处理异常:当使用CancellationToken时,要准备好处理可能抛出的TaskCanceledException。这可以确保你的代码能够优雅地处理取消操作。
  3. 资源清理:确保在取消操作后妥善处理和清理所有已分配的资源,以避免内存泄漏或其他潜在问题。
  4. 文档说明:如果你的方法接受一个CancellationToken参数,确保在方法的文档中明确说明这一点,以及取消操作对方法行为的具体影响。
  5. 测试:编写针对取消操作的单元测试,以确保你的代码在收到取消信号时能够正确响应。


请使用浏览器的分享功能分享到微信等