多线程是指在一个进程内并行执行多个线程的技术。每个线程都代表程序执行中的一个独立路径。多个线程共享进程中的资源(如内存、文件描述符等),但每个线程有自己的执行栈、程序计数器等
在开发中我们可以通过多线程,来让应用程序可以在多个处理器核心上并行运行不同的代码,提升应用程序的性能,或者是在需要处理多个任务的情况。
Task
类属于异步编程的一部分,使用 Task
代替线程进行操作可以提高代码的可读性,并且它能更高效地利用线程池。1. 使用 Thread 类
using System;
using System.Threading;
classProgram
{
static void Main()
{
Thread thread = new Thread(new ThreadStart(MyThreadMethod));
thread.Start();
}
static void MyThreadMethod()
{
Console.WriteLine("This is a separate thread.");
}
}
Thread
类用于直接创建和管理线程。MyThreadMethod
会在新的线程中执行。
2. 使用 ThreadPool
using System;
using System.Threading;
class Program
{
static void Main()
{
ThreadPool.QueueUserWorkItem(MyThreadMethod);
}
static void MyThreadMethod(object state)
{
Console.WriteLine("This is from thread pool.");
}
}
ThreadPool
可以自动管理线程池中的线程,适用于多个短时间的任务。ThreadPool
可以自动管理线程,不需要手动创建线程,可以提高性能。
3. 使用 Task 类(推荐)
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
await Task.Run(() => MyThreadMethod());
}
static void MyThreadMethod()
{
Console.WriteLine("This is an async task.");
}
}
Task
是执行异步操作的首选方式,支持线程池并且提供更多的功能,比如异步等待(await
)和错误处理。Task.Run
可以将任务异步执行,并且它会自动使用线程池中的线程。
4. 并行编程 (Parallel)
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Parallel.For(0, 10, i =>
{
Console.WriteLine($"Task {i} running on thread {Thread.CurrentThread.ManagedThreadId}");
});
}
}
Parallel.For
会并行执行任务,对处理大量独立任务非常有效。
Parallel
类来并行执行多个操作,适合 CPU 密集型任务。在多线程编程中,线程安全是一个重要的概念,意味着多个线程同时访问共享数据时,数据不会被破坏。常用的线程安全技术包括:
• 锁(lock): 使用 lock
语句来确保只有一个线程能够访问某段代码。
private static readonly object _lock = new object();
static void MyThreadMethod()
{
lock (_lock)
{
// 这里是线程安全的区域
}
}
• 线程安全集合: .NET 提供了线程安全的集合,如 ConcurrentQueue<T>
、ConcurrentDictionary<T, T>
等。
• 原子操作: 使用 Interlocked
类来执行原子操作,比如加法、比较交换等,避免线程干扰。
Thread
类可以创建并管理线程,但它相对较低效且不易管理。ThreadPool
可以自动管理线程,适用于并发执行多个小任务。Task
和 async/await
处理异步操作,通常是开发现代应用程序的首选。Parallel
可以并行处理多个任务,特别适合 CPU 密集型任务。