在本文中,我们将了解CancellationToken
(取消令牌)以及如何使用它。
在过去,当我们执行一些耗时的操作,比如耗时的数据库调用、耗时的HTTP调用时,我们没办法取消这些操作。
在应用程序中使用CancellationToken
有诸多好处,尤其在提高响应能力、资源管理以及用户体验方面。以下是一些关键优势:
CancellationToken
可以释放那些原本会被长时间运行的查询占用的数据库连接。CancellationToken
允许正在进行的操作优雅地终止,降低数据损坏或状态不一致的风险。自动超时:使用CancellationTokenSource.CancelAfter
来实现超时,可以自动取消超出指定时长的任务,确保应用程序保持响应能力。
CancellationToken
允许进行协作式取消,操作会定期检查令牌,看是否有取消请求,以便操作能够进行清理并优雅地终止。CancellationTokenSource
实例关联在一起,以便同时取消多个操作,这简化了复杂任务的协调工作。CancellationToken
建立了一种用于任务取消的标准模式,使代码更易于理解和维护。以下是一个展示如何使用CancellationToken
取消正在进行的操作的简化示例:
public async Task LongRunningOperationAsync(CancellationToken cancellationToken)
{
for (int i = 0; i < 100; i++)
{
// 定期检查是否有取消请求
cancellationToken.ThrowIfCancellationRequested();
// 模拟一些工作
await Task.Delay(100);
}
}
public async Task MainAsync()
{
using var cts = new CancellationTokenSource();
// 在2秒后取消操作
cts.CancelAfter(TimeSpan.FromSeconds(2));
try
{
await LongRunningOperationAsync(cts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("操作已被取消。");
}
}
运行代码时:
当我们运行这段代码时,会发现出现了OperationCanceledException
(操作已取消异常)。
使用CancellationToken
在响应能力、资源管理以及可扩展性方面有着显著的益处。通过在应用程序中合理地运用它,你可以极大地提升整体性能和用户体验。
我们可以使用CancellationToken
取消耗时的HttpClient
调用。这样一来,如果请求耗时过长或者满足了其他某些条件,你就可以中止该请求。以下是具体的操作方法:
CancellationTokenSource
你可以创建一个CancellationTokenSource
,并将它的令牌传递给HttpClient
调用。然后你可以在特定的超时时间后或者基于某些条件来取消该令牌。
看看下面的代码:
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
using var httpClient = new HttpClient();
using var cts = new CancellationTokenSource();
// 为请求设置超时时间
cts.CancelAfter(TimeSpan.FromSeconds(10)); // 10秒后取消
try
{
var response = await httpClient.GetAsync("https://example.com", cts.Token);
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (OperationCanceledException)
{
Console.WriteLine("请求已被取消。");
}
catch (HttpRequestException e)
{
Console.WriteLine($"请求出错:{e.Message}");
}
}
}
你可以通过调用CancellationTokenSource
的Cancel
方法来手动取消请求:
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
using var httpClient = new HttpClient();
using var cts = new CancellationTokenSource();
var task = httpClient.GetAsync("https://example.com", cts.Token);
// 模拟一些用于取消请求的条件
Task.Delay(2000).ContinueWith(_ => cts.Cancel());
try
{
var response = await task;
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (OperationCanceledException)
{
Console.WriteLine("请求已被取消。");
}
catch (HttpRequestException e)
{
Console.WriteLine($"请求出错:{e.Message}");
}
}
}
解释:
CancellationTokenSource
:创建CancellationTokenSource
的一个实例,它会提供一个CancellationToken
。cts.CancelAfter(TimeSpan.FromSeconds(x))
在指定时长后自动取消请求。HttpClient
调用:将CancellationToken
传递给GetAsync
方法。OperationCanceledException
来处理取消的情况。通过使用CancellationToken
,你可以在.NET Core中有效地管理并取消长时间运行的HttpClient
调用。