在C#中使用多线程可以通过几种不同的方式实现,常见的包括使用Thread类、ThreadPool类、Task类以及Parallel类。以下是每种方式的简单介绍和示例代码:
- 使用 Thread 类 Thread类是最基本的多线程方式,适用于创建和控制线程。
using System; using System.Threading;
class Program { static void Main() { // 创建一个新的线程 Thread thread = new Thread(new ThreadStart(PrintNumbers));
// 启动线程
thread.Start();
// 主线程执行的代码
for (int i = 0; i < 10; i++)
{
Console.WriteLine($Main Thread: {i});
Thread.Sleep(50);
}
// 等待线程结束
thread.Join();
}
static void PrintNumbers()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine($Worker Thread: {i});
Thread.Sleep(100);
}
}
}
- 使用 ThreadPool 类 ThreadPool类用于管理和复用线程池中的线程,适用于执行大量小任务。
using System; using System.Threading;
class Program { static void Main() { // 将工作项添加到线程池 ThreadPool.QueueUserWorkItem(new WaitCallback(PrintNumbers));
// 主线程执行的代码
for (int i = 0; i < 10; i++)
{
Console.WriteLine($Main Thread: {i});
Thread.Sleep(50);
}
// 由于ThreadPool没有直接的Join方法,需要使用其他同步机制
Thread.Sleep(1000); // 简单等待
}
static void PrintNumbers(object state)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine($Worker Thread: {i});
Thread.Sleep(100);
}
}
}
- 使用 Task 类 Task类是.NET 4.0引入的,用于简化异步和并行编程。Task提供了更高级的功能,如任务组合、取消、延续等。
using System; using System.Threading.Tasks;
class Program { static async Task Main(string[] args) { // 创建一个Task并启动 Task task = Task.Run(() => PrintNumbers());
// 主线程执行的代码
for (int i = 0; i < 10; i++)
{
Console.WriteLine($Main Thread: {i});
await Task.Delay(50);
}
// 等待任务完成
await task;
}
static void PrintNumbers()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine($Worker Thread: {i});
Task.Delay(100).Wait();
}
}
}
- 使用 Parallel 类 Parallel类用于简化并行循环(如Parallel.For和Parallel.ForEach)的编写。
using System; using System.Threading.Tasks;
class Program { static void Main() { // 并行执行循环 Parallel.For(0, 10, i => { Console.WriteLine($"Worker Thread: {i}"); Task.Delay(100).Wait(); });
// 主线程执行的代码
for (int i = 0; i < 10; i++)
{
Console.WriteLine($Main Thread: {i});
Task.Delay(50).Wait();
}
}
}
总结 Thread:适用于需要直接控制线程的情况。 ThreadPool:适用于执行大量小任务。 Task:适用于异步和并行编程,提供了丰富的功能。 Parallel:适用于并行循环,简化代码编写。