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)
async
和 await
是 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)
并发集合是线程安全的集合类,适用于多线程环境。常见的并发集合包括 ConcurrentQueue
、ConcurrentStack
和 ConcurrentDictionary
。
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 和并发集合。通过合理使用这些工具,你可以编写出高效且响应迅速的程序。
附加资源
练习
- 编写一个程序,使用
Task
并行计算 1 到 100 的平方和。 - 使用
ConcurrentDictionary
实现一个简单的缓存系统,允许多个线程同时读取和写入数据。
提示
在编写并发程序时,务必注意线程安全问题,避免竞态条件和死锁。