跳到主要内容

C# 并发编程概述

在现代软件开发中,并发编程是一个非常重要的概念。它允许程序同时执行多个任务,从而提高应用程序的性能和响应能力。C# 提供了多种工具和技术来实现并发编程,本文将为你介绍这些基础知识。

什么是并发编程?

并发编程是指在同一时间段内执行多个任务的能力。这些任务可以是独立的,也可以是相互依赖的。并发编程的主要目标是提高程序的效率和响应速度,尤其是在处理多核处理器时。

备注

并发并不等同于并行。并发是指多个任务在同一时间段内交替执行,而并行是指多个任务在同一时刻同时执行。

C# 中的并发编程工具

C# 提供了多种工具来实现并发编程,包括:

  • 线程(Thread)
  • 任务(Task)
  • 异步编程(async/await)
  • 并行 LINQ(PLINQ)
  • 并发集合(Concurrent Collections)

1. 线程(Thread)

线程是操作系统调度的最小单位。C# 中的 System.Threading.Thread 类允许你创建和管理线程。

csharp
using System;
using System.Threading;

class Program
{
static void Main()
{
Thread thread = new Thread(DoWork);
thread.Start();

Console.WriteLine("Main thread is running.");
}

static void DoWork()
{
Console.WriteLine("Worker thread is running.");
}
}

输出:

Main thread is running.
Worker thread is running.

2. 任务(Task)

Task 是 .NET 中用于表示异步操作的类。它比线程更高级,通常用于执行异步操作。

csharp
using System;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
Task task = Task.Run(() => DoWork());
Console.WriteLine("Main thread is running.");
await task;
}

static void DoWork()
{
Console.WriteLine("Worker task is running.");
}
}

输出:

Main thread is running.
Worker task is running.

3. 异步编程(async/await)

asyncawait 是 C# 中用于简化异步编程的关键字。它们使得编写异步代码更加直观和易于理解。

csharp
using System;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
Console.WriteLine("Starting async operation...");
await DoWorkAsync();
Console.WriteLine("Async operation completed.");
}

static async Task DoWorkAsync()
{
await Task.Delay(1000); // 模拟耗时操作
Console.WriteLine("Work done.");
}
}

输出:

Starting async operation...
Work done.
Async operation completed.

4. 并行 LINQ(PLINQ)

PLINQ 是 LINQ 的并行版本,它允许你在查询数据时自动并行化操作。

csharp
using System;
using System.Linq;

class Program
{
static void Main()
{
var numbers = Enumerable.Range(1, 10);

var squares = numbers.AsParallel()
.Select(n => n * n)
.ToList();

Console.WriteLine(string.Join(", ", squares));
}
}

输出:

1, 4, 9, 16, 25, 36, 49, 64, 81, 100

5. 并发集合(Concurrent Collections)

并发集合是线程安全的集合类,适用于多线程环境。常见的并发集合包括 ConcurrentQueueConcurrentStackConcurrentDictionary

csharp
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;

class Program
{
static void Main()
{
var queue = new ConcurrentQueue<int>();

Task producer = Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
queue.Enqueue(i);
}
});

Task consumer = Task.Run(() =>
{
while (queue.TryDequeue(out int item))
{
Console.WriteLine($"Dequeued: {item}");
}
});

Task.WaitAll(producer, consumer);
}
}

输出:

Dequeued: 0
Dequeued: 1
Dequeued: 2
...
Dequeued: 9

实际应用场景

并发编程在许多实际场景中都有应用,例如:

  • Web 服务器:处理多个客户端请求。
  • 数据处理:并行处理大量数据。
  • 游戏开发:同时处理用户输入、渲染和物理计算。

总结

并发编程是提高程序性能和响应能力的关键技术。C# 提供了多种工具和技术来实现并发编程,包括线程、任务、异步编程、PLINQ 和并发集合。通过合理使用这些工具,你可以编写出高效且响应迅速的程序。

附加资源

练习

  1. 编写一个程序,使用 Task 并行计算 1 到 100 的平方和。
  2. 使用 ConcurrentDictionary 实现一个简单的缓存系统,允许多个线程同时读取和写入数据。
提示

在编写并发程序时,务必注意线程安全问题,避免竞态条件和死锁。