using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks; /*
* 简化多线程使用,发挥主机最大性能
*
* 网论,可以不修改最大线程数,框架会根据实时资源情况启动任务,带内存保守机制
* 经测试,8 核心时可以达到理想状态,使用 32 核心CPU时,仅发挥CPU(内存)不到50%能力
* 结论,自己取核心数-1,指定给线程池,内存不足时线程池有保护功能,目前来看不用管内存问题
* 异步读写,计算量 > 读写量时,异步数可以等于核心数,否则 。。。
*
*/ namespace 线程池_ThreadPool
{
class Program
{
static void Main(string[] args)
{
//设置最大任务数
int num = getNumber();
ThreadPool.SetMaxThreads(num, num); string[] files = new string[10000]; // 1 匿名函数
for (int i = 0; i < files.Length; i++)
{
string filePath = files[i];
ThreadPool.QueueUserWorkItem((object sender) =>
{
//using (Bitmap map = new Bitmap(filePath))
//{
// BitmapData bmpData = map.LockBits(new Rectangle(Point.Empty, map.Size),
// ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
// byte[] buffer = new byte[bmpData.Stride * bmpData.Height];
// Marshal.Copy(bmpData.Scan0, buffer, 0, buffer.Length);
// // do something at this map...
// Marshal.Copy(buffer, 0, bmpData.Scan0, buffer.Length);
// map.UnlockBits(bmpData);
// map.Save(filePath);
// map.Dispose();
//}
//GC.Collect();
});
} // 2 调外部函数
for (int i = 0; i < files.Length; i++)
{
ThreadPool.QueueUserWorkItem(work, files[i]);
}
} static void work(object sender)
{
string filePath = sender.ToString();
using (Bitmap map = new Bitmap(filePath))
{
BitmapData bmpData = map.LockBits(new Rectangle(Point.Empty, map.Size),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
byte[] buffer = new byte[bmpData.Stride * bmpData.Height];
Marshal.Copy(bmpData.Scan0, buffer, 0, buffer.Length);
// do something at this map...
Marshal.Copy(buffer, 0, bmpData.Scan0, buffer.Length);
map.UnlockBits(bmpData);
map.Save(filePath);
map.Dispose();
}
GC.Collect();
}
/// <summary>
/// 获取核心数
/// </summary>
/// <returns></returns>
static int getNumber()
{
ManagementObjectCollection cpus = new ManagementClass("Win32_Processor").GetInstances();
int num = -1;
foreach (var cpu in cpus)
{
num += Convert.ToInt32(cpu.Properties["NumberOfLogicalProcessors"].Value);
}
return num;
}
}
}

  

线程池_ThreadPool的更多相关文章

  1. C++面向对象实现封装线程池

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  2. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  3. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  4. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  5. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  6. NGINX引入线程池 性能提升9倍

    1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...

  7. Java线程池解析

    Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...

  8. Android线程管理之ExecutorService线程池

    前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...

  9. Android线程管理之ThreadPoolExecutor自定义线程池

    前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...

随机推荐

  1. 4.Struts2中Action的三种访问方式

    1.传统的访问方式-很少使用 通过<action>标签中的method属性,访问到action中的具体方法 具体实现: 1.action代码 import com.opensymphony ...

  2. Atcoder arc092

    E-Both Sides Merger 给你一个序列,支持两种操作,直到序列中只有一个数时停下来,使得剩下数最大,并输出选数方案. 操作1:扔掉一个最前端或最后端的元素.操作2:选取一个不在边界上的元 ...

  3. cin,cout优化

    https://www.cnblogs.com/PrayG/p/5749832.html ios_base::sync_with_stdio(0);    cin.tie(0); 涨知识了

  4. 【转】Git 修改已提交的commit注释

    https://www.jianshu.com/p/098d85a58bf1 [重点] 通过git rebase -i HEAD~2 你想修改哪条注释 就把哪条注释前面的pick换成edit git ...

  5. [JZOJ 5129] 字符串

    题意:统计本质不同的串的个数. 思路: 显然后缀自动机,对于每个串建一个\(SAM\)统计即可. #include <bits/stdc++.h> using namespace std; ...

  6. KdPrint/DbgPrint and UNICODE_STRING/ANSI_STRING

    typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING ...

  7. C++之内存分区

  8. ionic-CSS:ionic 网格(Grid)

    ylbtech-ionic-CSS:ionic 网格(Grid) 1.返回顶部 1. ionic 网格(Grid) ionic 的网格(Grid)和其他大部分框架有所不同,它采用了弹性盒子模型(Fle ...

  9. KEIL, MDK 关于C99结构体变量初始化

    C99:here 例如声明了这样的结构体 void test1() { tt_t t1 ={ .a = , .d = 'd', .b = , .c = }; static tt_t t2 = { ,, ...

  10. Xtrabackup 热备

    Xtrabackup介绍Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁):m ...