在现代软件开发中,异步编程已成为提高应用程序性能和响应性的关键技术。C# 提供了强大的异步编程模型,其中 Task 和 CancellationTokenSource 是两个核心组件。本文将探讨这两个组件的使用方法和技巧,以及它们在异步编程中的妙用。
Task 是 C# 中表示异步操作的对象。它允许你在后台线程上执行代码,而不会阻塞主线程。使用 async 和 await 关键字,你可以轻松地编写异步代码。
创建一个 Task 非常简单,你可以使用 Task.Run 方法来启动一个后台任务:
Task.Run(() => {
// 耗时操作
});
你也可以在异步方法中使用 await 来等待 Task 的完成:
public async Task DoSomethingAsync() {
await Task.Run(() => {
// 耗时操作
});
}
CancellationTokenSource 是 C# 中用于实现异步操作取消的核心类。它允许你发送取消信号给正在执行的任务,使任务能够优雅地终止。
使用 CancellationTokenSource 发起取消请求的基本步骤如下:
CancellationTokenSource 并获取 CancellationToken。CancellationToken 传递给可取消的任务。Cancel 方法)。CancellationToken,并在取消时抛出 OperationCanceledException。using System;
using System.Threading;
using System.Threading.Tasks;
publicclassProgram {
public static void Main() {
usingvar cts = new CancellationTokenSource();
var task = Task.Run(() => DoWork(cts.Token), cts.Token);
// 发起取消请求
cts.Cancel();
try {
task.Wait(); // 等待任务完成
} catch (AggregateException ae) {
foreach (var e in ae.InnerExceptions) {
if (e is OperationCanceledException) {
Console.WriteLine("Task was cancelled.");
} else {
Console.WriteLine("Task threw an exception: " + e.Message);
}
}
}
}
public static void DoWork(CancellationToken token) {
for (int i = 0; i < 10; i++) {
token.ThrowIfCancellationRequested();
Console.WriteLine($"Working... {i}");
Thread.Sleep(500); // 模拟耗时操作
}
Console.WriteLine("Task completed.");
}
}
在这个示例中,DoWork 方法会定期检查 CancellationToken,并在检测到取消请求时抛出 OperationCanceledException。
有时,一个任务可能需要响应多个取消请求。可以通过 CancellationTokenSource.CreateLinkedTokenSource 方法合并多个 CancellationToken:
CancellationTokenSource cts1 = new CancellationTokenSource();
CancellationTokenSource cts2 = new CancellationTokenSource();
CancellationTokenSource linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cts1.Token, cts2.Token);
CancellationToken token = linkedCts.Token;
Task task = Task.Run(() => DoWork(token), token);
// 发出取消请求
cts1.Cancel(); // 或 cts2.Cancel();
token.ThrowIfCancellationRequested() 或 token.IsCancellationRequested 来检测取消信号。OperationCanceledException**:通常使用 try-catch 来捕获 OperationCanceledException,以确保任务取消后程序能正确处理。Task 和 CancellationTokenSource 是 C# 异步编程中不可或缺的工具。它们不仅提供了异步执行的能力,还允许你灵活地控制任务的取消。掌握这些技巧,可以帮助你编写出更高效、更健壮的异步代码。
原文作者:后端Q;如有侵权,请联系管理员删除。