C#多线程之线程池ThreadPool用法

C#多线程之线程池ThreadPool用法

线程池ThreadPool是什么

在程序运行过程中,有时会出现需要进行并发处理的情况。与传统的线程操作(Thread类)相比,线程池可以更好地管理线程资源,提高线程的复用率,避免了频繁创建和销毁线程的开销,从而提高了程序的性能和稳定性。

线程池通过预先创建一组线程并维护这些线程,让它们在没有工作时处于等待状态,一旦有工作需要处理,就将工作丢进线程池中,由池中的线程去执行。线程池还可以统计线程活动情况、限制可并发的线程数、管理线程的状态等等。.NET Framework提供了ThreadPool类来实现线程池功能。

线程池ThreadPool基本用法

创建线程池

指定最大线程数和完成队列大小,在开始使用线程池之前必须先创建一个。

ThreadPool.SetMaxThreads(int workerThreads, int completionPortThreads);

提交任务

方式1:将工作对象WaitCallback类型作为参数传递。

ThreadPool.QueueUserWorkItem(new WaitCallback(Process), data);

方式2:Lambda表达式传递。

ThreadPool.QueueUserWorkItem(state =>
{
    // do something    
}, null);

注意:如果需要将一个变量传递给任务,最好通过Lambda表达式把变量赋值给state参数,避免在多线程的情况下出现竞争条件。

线程池常用方法

  1. 获取当前线程池中可用的工作线程数和已完成的异步 I/O 操作线程数:
ThreadPool.GetAvailableThreads(out int workerThreads, out int completionPortThreads);
Console.WriteLine($"线程池中可用的工作线程数:{workerThreads}\n线程池中已完成的异步 I/O 操作线程数:{completionPortThreads}\n");
  1. 获取已请求的线程数和已完成的异步 I/O 操作数:
ThreadPool.GetMaxThreads(out int workerThreads, out int completionPortThreads);
Console.WriteLine($"线程池中请求的工作线程数:{workerThreads}\n线程池中已完成的异步 I/O 操作线程数:{completionPortThreads}\n");
  1. 获取等待执行的工作项数量:
int availableWorkerThreads, availableCompletionPortThreads;
ThreadPool.GetAvailableThreads(out availableWorkerThreads, out availableCompletionPortThreads);
Console.WriteLine($"线程池中等待处理的工作项数:{availableWorkerThreads}\n");

线程池ThreadPool使用示例

示例1:线程池调用简单方法

创建一个线程池,使用QueueUserWorkItem方法异步调用方法WorkProcess:

static void WorkProcess(object state)
{
    Console.WriteLine($"线程池处理方法:{state}");
}

static void Main(string[] args)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(WorkProcess),"Welcome to ThreadPool");
    Console.ReadLine();
}

输出结果为:

线程池处理方法:Welcome to ThreadPool

示例2:线程池处理复杂计算操作

使用QueueUserWorkItem异步调用方法Calculate,模拟一个大量耗时的计算操作,通过ManualResetEvent控制等待线程池中的线程都处理完成之后再输出结果。

static void Calculate(object state)
{
    Thread.Sleep(5000); // 模拟一个耗时计算操作
    int n = (int)state;
    Console.WriteLine($"线程池处理结果:{n * n}");
    mre.Set(); // 所有线程都处理完成退出等待状态
}

static ManualResetEvent mre = new ManualResetEvent(false);

static void Main(string[] args)
{
    int count = 10;
    for (int i = 0; i < count; i++)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(Calculate), i);
    }
    mre.WaitOne(); // 等待所有线程都处理完再输出结果
    Console.WriteLine("所有线程池中的线程都已处理完毕!");
    Console.ReadLine();
}

输出结果为:

线程池处理结果:0
线程池处理结果:1
线程池处理结果:4
线程池处理结果:9
线程池处理结果:16
线程池处理结果:25
线程池处理结果:36
线程池处理结果:49
线程池处理结果:64
线程池处理结果:81
所有线程池中的线程都已处理完毕!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程之线程池ThreadPool用法 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • JAVA多线程和并发基础面试问答(翻译)

    为了实现该攻略,首先我们需要明确一些关键点,如何理解多线程和并发,以及一些常见的面试问题和答案。 理解多线程和并发 在理解多线程和并发之前,先需要知道进程和线程的概念。 进程 在计算机科学中,进程是一个电脑程序运行时的实例。一个程序至少有一个进程。在操作系统中,进程是资源分配和调度的一个单位,每个进程都有其专用的地址空间、代码段、数据段和系统栈。 线程 线程…

    多线程 2023年5月16日
    00
  • php结合redis高并发下发帖、发微博的实现方法

    当Web应用程序的并发访问量增加时,数据读取和写入操作的性能可能会急剧下降,因为应用服务器可能因为高负载而无法处理所有的并发请求。为了解决这个问题,可以将应用程序的某些数据暂时存储到内存中,然后在内存中执行读取和写入操作。这种技术被称为缓存,而用于在Web应用程序中执行缓存的主要技术是Redis。 因此,在高并发下发布帖子、发微博等操作时,可以使用PHP结合…

    多线程 2023年5月16日
    00
  • Java多线程并发与并行和线程与进程案例

    关于Java多线程并发与并行以及线程与进程的学习攻略,可以按照以下步骤进行: 第一步:了解并发、并行、线程和进程的基本概念 在开始学习Java多线程,首先要了解并发、并行、线程和进程的基本概念。其中: 并发是指同一时间内执行多个任务的能力,比如CPU在多个线程之间快速切换来模拟同时执行多个任务的效果。 并行是指真正地同时执行多个任务,一般需要多个CPU核心来…

    多线程 2023年5月16日
    00
  • Python实现多线程HTTP下载器示例

    Python实现多线程HTTP下载器示例 简介 本示例是一个基于Python的多线程HTTP下载器,可以通过多个线程同时下载同一个文件,从而实现快速下载。 实现思路 首先获取文件的大小和下载链接,计算出每个线程需要下载的文件块的起始位置和结束位置 创建多个线程,每个线程下载一定范围的文件块,并将其保存到对应的文件路径中 主线程等待所有子线程结束,完成文件的下…

    多线程 2023年5月16日
    00
  • jdk自带线程池实例详解

    JDK自带线程池实例详解 线程池介绍 在应用程序开发中,使用线程是很常见的。当一个程序被执行时,它会生成一个主线程,这个主线程可以并行运行多个程序段。但如果程序中包含多个任务需要同时运行时,如果每个任务都创建自己的线程,这将会导致线程的大量创建和销毁,极度浪费资源。而线程池的出现解决了这个问题,它将多个任务合并在一起,让它们共享一个线程池中的线程完成任务。 …

    多线程 2023年5月16日
    00
  • IOS多线程编程的3种实现方法

    IOS多线程编程的3种实现方法 在IOS开发中,多线程编程是非常重要的一项技能。它可以使我们的应用程序更加流畅和安全。本文将介绍IOS多线程编程的3种实现方法,分别是NSThread,GCD和NSOperation。 1. NSThread NSThread是iOS提供的一种轻量级的多线程实现方法。我们可以通过以下步骤创建和启动一个线程: NSThread …

    多线程 2023年5月17日
    00
  • 初步讲解Ruby编程中的多线程

    下面我就给你讲解一下Ruby编程中的多线程。 初步讲解Ruby编程中的多线程 什么是多线程 多线程是指在程序中同时运行多个线程,每个线程可以独立执行不同的任务,从而提高程序的并发性和效率。 Ruby中多线程的基础知识 Ruby中的多线程是通过Thread类来实现的。通过创建不同的Thread对象,可以让这些对象同时运行,从而实现多线程编程。 创建Thread…

    多线程 2023年5月17日
    00
  • Java多线程并发编程(互斥锁Reentrant Lock)

    Java多线程并发编程(互斥锁Reentrant Lock)攻略 概述 在Java多线程编程中,为了保证多个线程并发执行时的安全性,我们需要使用同步控制。在Java中,synchronized关键字可以实现同步控制,但是它存在一些不足之处,比如它的锁只能是内置锁,无法进行灵活的控制和管理等。 为了解决这些问题,Java提供了一个更加灵活、功能更为强大的锁机制…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部