跳到主要内容

C# 任务并行

介绍

在编写程序时,我们经常需要执行多个任务。如果这些任务是独立的,我们可以通过并行化来提升程序的性能。C# 提供了 任务并行库 (Task Parallel Library, TPL),它简化了并行编程的复杂性,使我们能够轻松地并行化任务。

任务并行是指将一个大任务分解为多个小任务,并同时执行这些小任务。TPL 提供了 Task 类和 Parallel 类来实现任务并行。

任务并行库 (TPL) 简介

TPL 是 .NET 框架中的一个库,它提供了并行编程的支持。TPL 的核心是 Task 类,它表示一个异步操作。通过 Task,我们可以轻松地创建和管理并行任务。

使用 Task

Task 类是 TPL 的核心,它表示一个异步操作。我们可以使用 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() 用于等待任务完成。

使用 Parallel

Parallel 类提供了简单的并行化方法,例如 Parallel.ForParallel.ForEach。这些方法可以并行化循环操作。

csharp
using System;
using System.Threading.Tasks;

class Program
{
static void Main()
{
Parallel.For(0, 10, i =>
{
Console.WriteLine($"任务 {i} 正在执行...");
});

Console.WriteLine("所有任务完成。");
}
}

输出:

任务 0 正在执行...
任务 1 正在执行...
任务 2 正在执行...
任务 3 正在执行...
任务 4 正在执行...
任务 5 正在执行...
任务 6 正在执行...
任务 7 正在执行...
任务 8 正在执行...
任务 9 正在执行...
所有任务完成。

在这个例子中,Parallel.For 并行地执行了 10 个任务。

任务并行的实际应用

任务并行在许多场景中都非常有用,例如:

  1. 数据处理:当需要对大量数据进行处理时,可以将数据分成多个部分,并行处理。
  2. 图像处理:图像处理通常涉及对每个像素的操作,这些操作可以并行化。
  3. Web 请求:当需要从多个 Web 服务获取数据时,可以并行地发起请求。

实际案例:并行处理图像

假设我们有一个图像处理任务,需要对图像中的每个像素进行某种操作。我们可以使用 Parallel.For 来并行化这个任务。

csharp
using System;
using System.Drawing;
using System.Threading.Tasks;

class Program
{
static void Main()
{
Bitmap image = new Bitmap("example.jpg");

Parallel.For(0, image.Height, y =>
{
for (int x = 0; x < image.Width; x++)
{
Color pixel = image.GetPixel(x, y);
Color invertedPixel = Color.FromArgb(255 - pixel.R, 255 - pixel.G, 255 - pixel.B);
image.SetPixel(x, y, invertedPixel);
}
});

image.Save("inverted_example.jpg");
Console.WriteLine("图像处理完成。");
}
}

在这个例子中,我们使用 Parallel.For 并行地处理图像的每一行,将每个像素的颜色反转。

总结

任务并行是提升程序性能的有效方法。C# 的任务并行库 (TPL) 提供了简单而强大的工具来实现任务并行。通过 Task 类和 Parallel 类,我们可以轻松地并行化任务,从而充分利用多核处理器的能力。

提示

在实际开发中,使用任务并行时要注意线程安全问题,确保共享资源的访问是线程安全的。

附加资源与练习

  • 练习 1:尝试使用 Task 类创建一个任务,该任务计算从 1 到 100 的和。
  • 练习 2:使用 Parallel.ForEach 并行处理一个字符串列表,将每个字符串转换为大写。
  • 进一步阅读:查阅 Microsoft 官方文档 了解更多关于 TPL 的详细信息。