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; } } }