📜  c# 创建取消令牌 - C# (1)

📅  最后修改于: 2023-12-03 15:29:46.853000             🧑  作者: Mango

C# 创建取消令牌

在C#中,我们可以使用CancellationToken类和CancellationTokenSource类来创建取消令牌,帮助我们在异步操作中更好地管理并发问题。以下是如何使用它们以及相关代码示例。

CancellationToken

CancellationToken类可用于接收取消请求并通知异步操作。在调用异步方法时,我们可以传递此类的实例,以便进一步在任务执行时取消它。

创建CancellationToken实例

可以通过以下代码创建CancellationToken实例:

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;

此处,我们创建了CancellationTokenSource实例,然后使用Token属性访问它的令牌。

关联取消请求

我们可以在这个令牌上调用Cancel方法,以发出取消请求。它还提供了两个重载版本CancelAfterDispose

使用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实例

可以通过以下代码创建CancellationTokenSource实例:

CancellationTokenSource cts = new CancellationTokenSource();
关联到CancellationToken

可以使用这个实例的Token属性来创建可以监视和取消的操作。

var ct = cts.Token;
取消CancellationTokenSource

当我们完成操作后,可以通过以下代码取消此令牌:

cts.Cancel();

此处,cts.Cancel()将请求在ct令牌上取消操作。另外,我们还可以使用cts.CancelAfter(TimeSpan)方法使该操作超时。

销毁CancellationTokenSource

在使用完它时,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异常。

结论

CancellationTokenCancellationTokenSource类可用于帮助我们更好地管理并发问题,特别是在高并发异步环境中。了解这些类将有助于您编写更高效、更健壮的异步代码。