跳到主要内容

C# 任务并行库

介绍

在C#中,任务并行库(Task Parallel Library,简称TPL)是一个强大的工具,用于简化异步编程和多线程任务的处理。TPL 提供了一种高效的方式来并行执行任务,从而充分利用多核处理器的性能。通过使用 TaskTask<TResult> 类,开发者可以轻松地创建和管理异步操作,而无需直接处理线程的复杂性。

什么是任务并行库(TPL)?

任务并行库(TPL)是 .NET Framework 4.0 引入的一个库,旨在简化并行编程。它通过提供高层次的抽象,使得开发者可以更容易地编写并行代码。TPL 的核心是 Task 类,它代表一个异步操作。通过使用 Task,开发者可以将复杂的多线程操作分解为多个小任务,并让 TPL 自动管理这些任务的执行。

基本概念

Task 类

Task 类代表一个异步操作。它可以是一个没有返回值的操作,也可以是一个返回特定类型结果的操作(通过 Task<TResult> 类)。Task 类提供了多种方法来创建、启动和管理任务。

创建和启动任务

你可以使用 Task.Run 方法来创建并启动一个任务。以下是一个简单的示例:

csharp
using System;
using System.Threading.Tasks;

class Program
{
static void Main()
{
Task task = Task.Run(() =>
{
Console.WriteLine("任务正在运行...");
});

task.Wait(); // 等待任务完成
Console.WriteLine("任务完成。");
}
}

输出:

任务正在运行...
任务完成。

在这个示例中,Task.Run 方法创建并启动了一个任务,该任务在后台线程中执行。task.Wait() 方法用于等待任务完成。

异步任务

你也可以使用 asyncawait 关键字来编写异步代码。以下是一个使用 asyncawait 的示例:

csharp
using System;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
await Task.Run(() =>
{
Console.WriteLine("异步任务正在运行...");
});

Console.WriteLine("异步任务完成。");
}
}

输出:

异步任务正在运行...
异步任务完成。

在这个示例中,await 关键字用于等待任务完成,而不会阻塞主线程。

实际应用场景

并行处理数据

假设你有一个需要处理大量数据的应用程序,你可以使用 TPL 来并行处理这些数据,从而提高性能。以下是一个并行处理数据的示例:

csharp
using System;
using System.Linq;
using System.Threading.Tasks;

class Program
{
static void Main()
{
int[] data = Enumerable.Range(1, 100).ToArray();

Parallel.ForEach(data, (item) =>
{
Console.WriteLine($"处理数据: {item}");
});

Console.WriteLine("数据处理完成。");
}
}

输出:

处理数据: 1
处理数据: 2
...
处理数据: 100
数据处理完成。

在这个示例中,Parallel.ForEach 方法用于并行处理数组中的每个元素。

任务链

你可以将多个任务链接在一起,以便在一个任务完成后执行另一个任务。以下是一个任务链的示例:

csharp
using System;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
Task<int> task1 = Task.Run(() => 10);
Task<int> task2 = task1.ContinueWith(t => t.Result * 2);
Task<int> task3 = task2.ContinueWith(t => t.Result + 5);

int result = await task3;
Console.WriteLine($"最终结果: {result}");
}
}

输出:

最终结果: 25

在这个示例中,task1 的结果被传递给 task2task2 的结果又被传递给 task3,最终结果被输出。

总结

C# 的任务并行库(TPL)为开发者提供了一种简单而强大的方式来处理异步编程和多线程任务。通过使用 Task 类、asyncawait 关键字,以及 Parallel 类,你可以轻松地编写高效的并行代码。

附加资源

练习

  1. 编写一个程序,使用 Task.Run 并行执行三个不同的任务,并在所有任务完成后输出 "所有任务完成"。
  2. 使用 Parallel.ForEach 并行处理一个包含 1000 个元素的数组,并计算每个元素的平方。
  3. 创建一个任务链,其中第一个任务返回一个随机数,第二个任务将该随机数乘以 2,第三个任务将结果加 10,并输出最终结果。

通过完成这些练习,你将更好地理解 C# 任务并行库的使用方法。