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日

相关文章

  • SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)推荐

    实现SpringBoot中并发定时任务和动态定时任务,可以使用Spring框架提供的@Scheduled注解和Quartz定时任务框架。 并发定时任务的实现 (1) 引入依赖 在pom.xml文件中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId&gt…

    多线程 2023年5月17日
    00
  • 深入SQLite多线程的使用总结详解

    下面为您详细讲解“深入SQLite多线程的使用总结详解”的完整攻略。 概述 在高并发场景下,为了提升数据访问效率,多线程访问数据库已经成为了必要的需求。而SQLite作为轻量级的嵌入式数据库,因其灵活的使用方式和可靠的性能表现,成为了许多应用的首选。本文将深入探讨SQLite多线程的使用方法和技巧,同时提供实战性的示例代码供读者参考。 SQLite多线程的使…

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

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

    多线程 2023年5月16日
    00
  • java并发之Lock接口的深入讲解

    Java并发之Lock接口的深入讲解 在Java并发编程中,Lock接口是一种替代传统的synchronized关键字的选择。相比于synchronized关键字,Lock接口提供了更精细的锁控制,如可重入性、可中断性、公平性等特性。本文将深入讲解Lock接口的使用方法和注意事项。 一、Lock接口简介 Lock接口是一个包含多个获取锁和释放锁方法的接口。它…

    多线程 2023年5月17日
    00
  • Java并发中的Fork/Join 框架机制详解

    Java并发中的Fork/Join 框架机制详解 介绍 Java并发中的Fork/Join框架是Java SE7中的一个处理器并行的框架。在处理大规模的并行性任务时,使用这个框架可以得到更好的性能。这个框架的核心类是ForkJoinPool和ForkJoinTask。 ForkJoinPool ForkJoinPool是Java并发中的线程池。它内部维护着一…

    多线程 2023年5月16日
    00
  • 使用Redis incr解决并发问题的操作

    使用Redis incr操作可以解决并发问题。在Redis中,incr命令表示给定键的值增加1。在多人并发访问同一个键时,incr命令可以一定程度上解决并发问题。 以下是采取Redis incr解决并发问题的攻略: 1、设计键名 在设计键名时,应该遵循以下原则: 键名要尽可能简短和清晰易懂,以利于代码编写和阅读。 键名应该尽可能遵循命名规范,包括大小写、下划…

    多线程 2023年5月16日
    00
  • Java多线程的用法详细介绍

    Java多线程的用法详细介绍 什么是多线程? 多线程是一种同时执行多个线程的技术,可以提高程序的效率和性能。一个Java程序默认会有一个单独的主线程,而其余的线程可以通过创建新的线程来进行并发执行。多线程技术应用广泛,例如通过多线程技术可以为用户提供并发访问服务,对于大规模数据的处理,多线程技术也有很大作用。 Java多线程的用法 Java多线程主要是通过创…

    多线程 2023年5月17日
    00
  • 浅析Disruptor高性能线程消息传递并发框架

    浅析Disruptor高性能线程消息传递并发框架 Disruptor是一个高性能线程消息传递并发框架,它的操作主要是在内存中进行,最早由LMAX Exchange公司开源,并且在金融领域得到广泛应用。Disruptor与传统的生产者/消费者模式相比,最大的优势在于它可以避免锁竞争、缓存不命中等问题,从而获得更高的性能。 Disruptor的核心概念 Ring…

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