如何在C#中使用 CancellationToken 处理异步任务

使用 CancellationToken 处理异步任务

在C#中,异步编程是一项重要的技术,能够提高程序的性能和响应能力。然而,在处理异步任务时,我们也需要注意到一些可能出现的问题,例如任务的取消。为了有效地处理任务的取消,我们可以使用 CancellationToken。

什么是 CancellationToken

CancellationToken是一个用于取消操作的标志。它是C#提供的一个类,可以在异步任务中用于请求任务的取消。当CancellationToken被取消时,可以通过判断IsCancellationRequested属性来检查任务是否被取消。

在使用CancellationToken时,通常需要将其传递给异步任务的方法中,以便在任务执行期间能够检查是否需要取消任务。一般来说,需要传递CancellationToken的方法通常具有一个额外的参数,如下所示:

public async Task<string> DoSomeAsyncWork(CancellationToken cancellationToken)

{

// 检查是否需要取消任务

if (cancellationToken.IsCancellationRequested)

{

return "Task cancelled.";

}

// 执行其他异步操作

return "Task completed.";

}

在以上示例中,我们传递了一个CancellationToken参数,并在方法的开头检查了IsCancellationRequested属性的值。如果该属性为true,表示任务已经被取消,我们可以根据需要返回相应的信息。

如何使用 CancellationToken

在使用CancellationToken时,通常需要创建一个CancellationTokenSource对象,并将其与CancellationToken关联起来。CancellationTokenSource是CancellationToken的提供者,可以通过它来取消任务。以下是使用CancellationToken的一般步骤:

1. 创建 CancellationTokenSource

首先,我们需要创建一个CancellationTokenSource对象,如下所示:

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

2. 获取 CancellationToken

然后,我们可以通过CancellationTokenSource的Token属性来获取CancellationToken:

CancellationToken cancellationToken = cancellationTokenSource.Token;

3. 将 CancellationToken 传递给异步方法

接下来,我们将CancellationToken传递给需要进行取消检查的异步方法,例如:

await DoSomeAsyncWork(cancellationToken);

在异步方法内部,我们可以使用CancellationToken来检查任务是否需要取消。

4. 请求取消任务

最后,在需要取消任务的时候,我们可以调用CancellationTokenSource的Cancel方法来请求取消任务:

cancellationTokenSource.Cancel();

这样,我们就可以请求取消任务,并在异步方法中进行相应的处理。

使用 CancellationToken 处理异步任务

下面我们通过一个具体的示例来演示如何使用CancellationToken处理异步任务。

static async Task<int> CalculateSumAsync(int[] numbers, CancellationToken cancellationToken)

{

int sum = 0;

for (int i = 0; i < numbers.Length; i++)

{

// 检查是否需要取消任务

if (cancellationToken.IsCancellationRequested)

{

return sum;

}

await Task.Delay(100); // 模拟计算的时间消耗

sum += numbers[i];

}

return sum;

}

static async Task Main(string[] args)

{

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

CancellationToken cancellationToken = cancellationTokenSource.Token;

Task<int> task = CalculateSumAsync(numbers, cancellationToken);

// 模拟用户在计算过程中取消任务

cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(2));

try

{

int result = await task;

Console.WriteLine("Sum: " + result);

}

catch (OperationCanceledException)

{

Console.WriteLine("Task cancelled.");

}

}

在上述示例中,我们定义了一个计算数组元素和的异步方法CalculateSumAsync,并传递了CancellationToken。

在Main方法中,我们首先创建了一个CancellationTokenSource,并获取了CancellationToken。然后,我们调用了CalculateSumAsync方法并传递了CancellationToken。

接着,我们在2秒后调用了CancellationTokenSource的Cancel方法,模拟用户在计算过程中取消了任务。

最后,我们通过await关键字等待计算结果,并捕获了可能抛出的OperationCanceledException,以便在任务被取消时得到相应的处理。

总结

通过使用CancellationToken,我们可以有效地处理异步任务的取消。通过在异步方法中检查IsCancellationRequested属性,我们可以判断任务是否需要取消,并进行相应的处理。同时,通过使用CancellationTokenSource对象,我们可以请求取消任务。这些技术在处理异步任务时非常有用,并能提高程序的响应性和可靠性。

后端开发标签