C# 线程池和编程实例
一 
    线程池可以看做容纳线程的容器;
    一个应用程序最多只能有一个线程池;
    ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池;
    每排入一个工作函数,就相当于请求创建一个线程;

线程池的作用:
    线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
    如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止。

你可以通过 System.Threading 名称空间的 Thread Pool 类 来使用线程池,如果你查看一下这个类,就会发现所有的成员都是静态的,而且没有公开的构造函数。这是有理由这样做的,因为每个进程只有一个线程池,并且我 们不能创建新的。这个限制的目的是为了把所有的异步编程技术都集中到同一个池中。所以我们不能拥有一个通过第三方组建创建的无法管理的线程池。

二 实例

程序运行结果截图;

码码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

//public delegate void WaitCallback(Object state);

namespace ThreadPool1
{
    public partial class Form1 : Form
    {

static double number1 = -1;
        static double number2 = -1;
        // 函数变量值
        int x = 18808;

public Form1()
        {
            InitializeComponent();
        }

void Draw1(string str1, int xPos = 0, int yPos = 0)
        {
            SolidBrush aBrush = new SolidBrush(Color.Blue);
            Font aFont = new Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Millimeter);

Graphics graphic = this.CreateGraphics();
            graphic.DrawString(str1, aFont, aBrush, xPos, yPos);
        }

void ClsFrm()
        {
            Graphics graphic = this.CreateGraphics();
            graphic.Clear(this.BackColor);
        }

private void button1_Click(object sender, EventArgs e)
        {
            int maxThreadNum, portThreadNum;
            int minThreadNum;
            ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
            ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
            ClsFrm();
            Draw1("最大线程数:" + maxThreadNum.ToString(), 100, 100);
            Draw1("最小空闲线程数:" + minThreadNum.ToString(), 100, 130);
        }

private void button2_Click(object sender, EventArgs e)
        {
            // 启动第一个任务:计算x的8次方
            ClsFrm();
            Draw1("启动第一个任务:计算18808的8次方。", 100, 100);
            ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);    
        }

private void button3_Click(object sender, EventArgs e)
        {
            // 启动第二个任务:计算x的8次方根
            ClsFrm();
            Draw1("启动第二个任务:计算18808的8次方根。", 100, 100);
            ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);
        }

private void button4_Click(object sender, EventArgs e)
        {
            // 等待,直到两个数值都完成计算
            while (number1 == -1 || number2 == -1) ;

// 打印计算结果
            ClsFrm();
            Draw1(number1.ToString() + "    " + number2.ToString(), 100, 100);
        }

// 启动第一个任务:计算x的8次方
         static void TaskProc1(object o)
        {
            number1 = Math.Pow(Convert.ToDouble(o), 8);
        }

// 启动第二个任务:计算x的8次方根
        static void TaskProc2(object o)
        {
            number2 = Math.Pow(Convert.ToDouble(o), 1.0 / 8.0);
        }
    }

}

代码要点:
    引入命名空间:using System.Threading;

这两个函数偶自制,用于在窗体上显示内容和清除显示;
void Draw1(string str1, int xPos = 0, int yPos = 0)
void ClsFrm()

ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
    TaskProc1是线程的执行函数,

ThreadPool.QueueUserWorkItem 方法:
    将方法排入队列以便执行,并指定包含该方法所用数据的对象。 此方法在有线程池线程变得可用时执行。
    public static bool QueueUserWorkItem(
WaitCallback callBack,
Object state
    )
    参数:
    callBack    类型:System.Threading.WaitCallback    WaitCallback ,它表示要执行的方法。
    state    类型:System.Object    包含方法所用数据的对象。
    返回值    类型:System.Boolean    如果此方法成功排队,则为 true;如果无法将该工作项排队,则引发 NotSupportedException。

C# 线程池和编程实例相关推荐

  1. 最新天猫面试题(含总结):线程池+并发编程+分布式设计+中间件

    最新天猫面试题(含总结):线程池+并发编程+分布式设计+中间件 https://my.oschina.net/u/3892...

  2. 【python爬虫学习记录 持续更新】多线程多进程,带线程池爬取实例

    文章目录 简介 多线程codingFrame 多进程codingFrame 线程池与进程池 线程池爬取实例(主页url隐了 主要看思路 和如何使用线程池框架) 简介 进程是资源单位 线程是执行单位 每 ...

  3. Java线程池原理与实例详解

    Wiki 采用new Thread的方式产生多线程,可能有以下一些问题:  线程的创建和销毁开销很大,尤其是有些线程的存在时间较短:  线程的创建和销毁过程中伴随着CPU在线程间的切换,开销很大: ...

  4. 最新天猫Java面试题(含总结):线程池+并发编程+分布式设计+中间件

    一面: HashMap实现原理,ConcurrentHashMap实现原理 红黑树,为什么允许局部不平衡 TCP,UDP区别,为什么可靠和不可靠 一次HTTP请求的全过程,包括域名解析.定位主机等 T ...

  5. Java线程池ThreadPoolExecutor的实例

    Java.util中的线程池和Spring框架对这个类的扩展 1.单独通过java里的ThreadPoolExecutor这个类,可以创建线程池,如果系统采用Spring框架设计,可以采用Thread ...

  6. C# 实现单线程线程池并调用实例

    2019独角兽企业重金招聘Python工程师标准>>> using System; using System.Collections.Generic; using System.Te ...

  7. java基础进阶(文件列表,线程,线程组)编程实例(4篇)

    此处刊登代码均测试通过,完全准确! import java.io.*; public class DirList{ public static void main(String[] args){ tr ...

  8. Java高并发编程:线程池

    这里首先介绍了java5中的并发的小工具包:java.util.concurrent.atomic,然后介绍了线程池的概念,对使用java5的方式创建不同形式的线程进行了演示,之后介绍了两个 对象:C ...

  9. Java并发编程:4种线程池和缓冲队列BlockingQueue

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动 ...

最新文章

  1. jsp空间流量是怎么计算的?
  2. 格式android id,android 获取APP的唯一标识applicationId的实例
  3. c#_winform打开关闭时淡入淡出
  4. Codeforces Round #265 (Div. 1) C. Substitutes in Number dp
  5. Redis 缓存常见问题 :缓存雪崩,缓存击穿,缓存穿透,缓存预热
  6. Android开发之RecyclerView嵌套ListView自动计算高度的方法
  7. Linux并发与竞争介绍(原子操作、自旋锁、信号量、互斥体)
  8. deepin安装bochs2.6.2_2.kafka安装与使用
  9. c#如何实现IComparable接口
  10. 深入理解java虚拟机读书笔记(三)
  11. TCS2010(中国标准编写模板)安装教程+解决三级标题条无法设置
  12. 数据恢复软件性能大比拼
  13. 使用Ruffle搭建运行Flash的网页
  14. mac u盘重装系统(monterey)
  15. 什么杀毒软件最好|什么杀毒软件好用
  16. 用基带等效的方式仿真8-DPSK载波调制信号在AWGN信道下的误码率和误比特率,并与理论值相比较。
  17. EDA 电子设计自动化VHDL系列课程8 – 脉冲信号发生器
  18. goodFeaturesToTrack——Shi-Tomasi角点检测
  19. 电脑现在找不到驱动器,设备管理器显示DVD/CD-ROM驱动器是黄色感叹号
  20. Eclipse官网下载

热门文章

  1. 99. 恢复二叉搜索树
  2. Work From Anywhere
  3. 标签页使用及bug解决
  4. CSS3文本居中显示、圆形圆角绘制、立体阴影效果设置实例演示
  5. Python 相对路径、绝对路径的写法实例演示
  6. Windows 技巧篇-通过“控制面板-程序和附件“查看程序安装位置实例演示
  7. PyQt5 技术篇 - 按钮隐藏并保留位置,pyqt5设置按钮的可见度,设置按钮透明度
  8. 电磁场与电磁波第四章 时变电磁场
  9. YTU 1495 蛇行矩阵 YTU 1607 字符棱形YTU 1959 图案打印YTU 2016 打印金字塔
  10. 1.1 基本图像导入、处理和导出