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. Eclipse导入Maven项目解决Build Path不能配置问题

    Eclipse Mars Release (4.5.0)导入Maven项目时,发现项目Build Path不能配置,如下图所示: 解决办法: 1修改Project Facets 项目右键---> ...

  2. html input 上capture 参数在 安卓 苹果上的异同

    安卓上 <input type="file" accept="image/*" capture="camera"> //只调用相 ...

  3. *args和**kwargs用法

    ''' @Date: 2019-10-10 21:14:56 @LastEditors: 冯浩 @LastEditTime: 2019-10-20 22:38:16 ''' def func(*arg ...

  4. leetcode-第11场双周赛-5088-等差数列中缺失的数字

    题目描述: 自己的提交: class Solution: def missingNumber(self, arr: List[int]) -> int: if len(arr) == 2: re ...

  5. 自定义alert 确定、取消功能

    以删除为例,首先新建html <table border="1" cellpadding="0" cellspacing="0" id ...

  6. gulp 安装与使用

    一.Gulp 是基于node.js 流(stream)的一个前端自动化构建工具,可以使用它构建自动化工作流程,简化我们工作量,让我们把重点放在功能的开发上,从而提高我们的开发效率和工作质量 我们可以用 ...

  7. idea使用问题

    1. 问题: 突发断电导致idea的play项目错误,无法识别build.sbt,build.sbt文件报错,Cannot resolve symbol 解决方案: For anyone having ...

  8. LeetCode 197. Rising Temperature (上升的温度)

    题目标签: 题目给了我们一个 温度表格,让我们找到 所有温度比之前一天高的,返回id. 建立 Weather w1, Weather w2,找到当w1 的温度 大于 w2 的时候,而且 w1 的日期是 ...

  9. oracle一体机(exdata)创建ACFS文件系统

    ACFS是一个支持多个平台,可扩展的,基于ORACLE ASM的集群文件系统,可以用来存储数据库和各种应用的文件,包括数据库的trace文件,alert日志文件和配置文件等等,也可以用来存储视频,音频 ...

  10. sql基础学习

    学习参考网站:http://www.runoob.com/sql/sql-tutorial.html 一.SQL命令 1.SELECT 语句 用于从数据库中选取数据. select column_na ...