📅  最后修改于: 2023-12-03 15:29:46.853000             🧑  作者: Mango
在C#中,我们可以使用CancellationToken
类和CancellationTokenSource
类来创建取消令牌,帮助我们在异步操作中更好地管理并发问题。以下是如何使用它们以及相关代码示例。
CancellationToken
类可用于接收取消请求并通知异步操作。在调用异步方法时,我们可以传递此类的实例,以便进一步在任务执行时取消它。
可以通过以下代码创建CancellationToken
实例:
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
此处,我们创建了CancellationTokenSource
实例,然后使用Token
属性访问它的令牌。
我们可以在这个令牌上调用Cancel
方法,以发出取消请求。它还提供了两个重载版本CancelAfter
和Dispose
。
使用CancelAfter
方法创建了一个定时取消的令牌。我们可以通过它传递一个TimeSpan
参数,表示在多长时间后取消任务。例如,以下代码将在10秒后取消任务:
cts.CancelAfter(TimeSpan.FromSeconds(10));
当我们完成操作时,我们可以使用Dispose()
方法来销毁CancellationTokenSource
实例及其相关资源。
既然有了取消请求,我们可以在异步方法中利用它们,及时取消任务。
CancellationToken
类提供了以下方法来检查取消请求:
IsCancellationRequested
:返回布尔值,指示是否请求取消操作ThrowIfCancellationRequested
:如果已请求取消,则抛出OperationCanceledException
示例如下:
async Task MyMethod(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
// Do some work here.
}
ct.ThrowIfCancellationRequested(); // Throws OperationCanceledException if cancellation was requested.
}
CancellationTokenSource
类用于生成令牌并与之关联的取消请求。取消请求由令牌表示,可以在异步方法中使用。
可以通过以下代码创建CancellationTokenSource
实例:
CancellationTokenSource cts = new CancellationTokenSource();
可以使用这个实例的Token
属性来创建可以监视和取消的操作。
var ct = cts.Token;
当我们完成操作后,可以通过以下代码取消此令牌:
cts.Cancel();
此处,cts.Cancel()
将请求在ct
令牌上取消操作。另外,我们还可以使用cts.CancelAfter(TimeSpan)
方法使该操作超时。
在使用完它时,CancellationTokenSource
必须显式地销毁以释放与之关联的资源:
cts.Dispose();
下面是一个示例代码,演示如何在异步方法中使用取消令牌:
async Task MyMethod(CancellationToken ct)
{
try
{
while (!ct.IsCancellationRequested)
{
// Do some work here.
await Task.Delay(1000, ct); // Delay for 1 second, and check for cancellation.
}
}
catch (OperationCanceledException)
{
Console.WriteLine("Canceled!");
}
}
在上述示例代码中,我们使用了CancellationToken
类的IsCancellationRequested
方法来检查取消请求。如果取消请求被发出,则它会引发OperationCanceledException
异常。
CancellationToken
和CancellationTokenSource
类可用于帮助我们更好地管理并发问题,特别是在高并发异步环境中。了解这些类将有助于您编写更高效、更健壮的异步代码。