前言
线程是计算机中的一个基本概念,它允许多个操作同时运行,从而充分利用可用资源,并提高程序性能。在 C# 中, System.Threading
命名空间提供了一组丰富的类来管理和控制线程。在这篇文章中,我们将通过示例从基本概念到高级概念,探索 C# 中的线程。
什么是线程?
线程是进程内的最小执行单元。每个线程都有自己的堆栈和局部变量。在 C# 中,主线程是执行 Main 方法的线程。不过,您可以创建额外的线程来并行运行任务。
创建线程
要在 C# 中创建线程,可以使用 System.Threading
命名空间中的 Thread
类。
using System;
using System.Threading;
class Program
{
static void Main()
{
Thread newThread = new Thread(new ThreadStart(PrintNumbers));
newThread.Start();
}
static void PrintNumbers()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
}
}
在上面的示例中,我们创建了一个新线程,来运行 PrintNumbers 方法。
线程生命周期
线程在其生命周期中会经历各种状态:
Unstarted
线程已创建但未启动。
Running
线程当前正在执行。
WaitSleepJoin
线程被阻塞,等待某些条件。
Stopped
线程已完成执行或已中止。
您可以使用 ThreadState 属性检查线程的状态。
线程同步
当多个线程访问共享资源时,可能会出现竞争条件。为了防止这种情况,您可以使用同步技术。
Lock 锁
lock 关键字可以确保一个线程在临界区时,另一个线程不进入临界区。
private static object _lock = new object();
static void SafePrint(string message)
{
lock (_lock)
{
Console.WriteLine(message);
}
}
Mutex 互斥锁
互斥锁类似于锁,但可以跨多个进程工作。
using (Mutex mutex = new Mutex(false, "MyMutexName"))
{
mutex.WaitOne();
// ...
mutex.ReleaseMutex()
}
高级线程概念
Thread Pooling 线程池
您可以使用线程池,ThreadPool 类允许您对任务进行排队,它会自动管理各个线程。
ThreadPool.QueueUserWorkItem((state) => {
Console.WriteLine("This is running in a thread pool thread.");
});
Tasks 任务
任务代表异步操作。它们构建在线程池之上,并提供更高级别的并发处理方式。
using System.Threading.Tasks;
Task.Run(() => {
Console.WriteLine("This is running in a task.");
});
Parallel Loops 并行循环
Parallel 类提供了一种并行化循环的方法,使它们在多核系统上运行得更快。
Parallel.For(0, 10, i => {
Console.WriteLine($"Parallel loop iteration: {i}");
});
总结
C# 中的线程提供了一种利用并发性来提高应用程序性能的强大方法。无论您是刚刚入门还是希望深入研究高级概念, System.Threading
命名空间提供了您所需的所有工具。,希望对您有用!