C#多线程之线程池ThreadPool详解
简介
线程池是一种使用共享资源(线程)的方式,它在系统中维护着一定数量的线程,在任务到来时将其分配给线程执行,执行完毕后线程归还给线程池,以便其他任务使用。线程池采用的是池化思想,能够避免频繁创建和销毁线程造成的资源浪费,提高程序性能。在C#中,我们可以使用ThreadPool类实现线程池的功能。
线程池的优点
- 线程池重用现有线程,避免了频繁创建和销毁线程的开销;
- 可以限制同时执行的线程数量,防止系统因为线程数量过多而崩溃;
- 通过线程池管理线程,可以更好地控制程序的执行。
线程池的创建
我们可以通过ThreadPool类的静态方法创建线程池,其中最常用的方法是:
public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
其中,workerThreads参数表示线程池中的工作线程数量,completionPortThreads参数表示线程池中的I/O线程数量。该方法返回一个布尔值,表示线程池的最大线程数是否设置成功。
示例
这里我们设置线程池中的工作线程数量为10,I/O线程数量为4:
ThreadPool.SetMaxThreads(10, 4);
线程池的使用
向线程池中添加任务
线程池的核心功能就是执行任务,我们可以通过QueueUserWorkItem方法向线程池中添加任务:
public static bool QueueUserWorkItem(WaitCallback callBack);
public static bool QueueUserWorkItem(WaitCallback callBack, object state);
其中,第一个方法只接受一个WaitCallback委托作为参数,第二个方法不仅接受WaitCallback委托,还可以传入一个object类型的状态参数state。
示例1
下面示例演示了如何向线程池中添加任务,这里我们定义了一个回调方法DoWork,将其传入QueueUserWorkItem方法中:
public static void DoWork(object state)
{
Console.WriteLine($"Task {state} is executing on thread {Thread.CurrentThread.ManagedThreadId}");
}
ThreadPool.QueueUserWorkItem(DoWork, "A");
ThreadPool.QueueUserWorkItem(DoWork, "B");
ThreadPool.QueueUserWorkItem(DoWork, "C");
运行程序,输出结果如下:
Task A is executing on thread 3
Task C is executing on thread 4
Task B is executing on thread 5
可以发现,线程池中的三个任务被分别分配给了不同的线程执行。
示例2
我们可以使用AutoResetEvent类型的事件来阻塞线程,当线程完成任务后,发出信号解除阻塞。下面示例演示了如何使用AutoResetEvent实现同步:
public static void DoWork(object state)
{
Console.WriteLine($"Task {state} is executing on thread {Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(1000);
}
AutoResetEvent resetEvent = new AutoResetEvent(false);
for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem((state) =>
{
DoWork(state);
if (Interlocked.Decrement(ref count) == 0)
{
resetEvent.Set();
}
}, i);
}
resetEvent.WaitOne();
Console.WriteLine("All tasks have been executed.");
该示例中,我们向线程池中添加了10个任务,并使用AutoResetEvent类型的resetEvent事件来同步这10个任务。当线程池中的10个任务完成后,resetEvent事件发出信号,解除线程阻塞。
总结
线程池是一种非常有用的多线程技术,可以避免频繁创建和销毁线程造成的资源浪费,提高程序性能。在C#中,我们可以使用ThreadPool类来实现线程池的功能。通过QueueUserWorkItem方法向线程池中添加任务,可以实现多线程操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程之线程池ThreadPool详解 - Python技术站