-
C#教程之C# 扩展TaskScheduler实现独立线程池,支持多任务批量处理,互不干扰,无缝兼容(2)
本站最新发布 C#从入门到精通
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
{ if (_MainPageTask == null) _MainPageTask = new LimitedTaskScheduler(16); return _MainPageTask; } } #endregion #region 图片加载任务 private static LimitedTaskScheduler _LoadImageTask; /// <summary> /// 图片加载任务(32个线程) /// </summary> public static LimitedTaskScheduler LoadImageTask { get { if (_LoadImageTask == null) _LoadImageTask = new LimitedTaskScheduler(32); return _LoadImageTask; } } #endregion #region 浏览器任务 private static LimitedTaskScheduler _BrowserTask; /// <summary> /// 浏览器任务 /// </summary> public static LimitedTaskScheduler BrowserTask { get { if (_BrowserTask == null) _BrowserTask = new LimitedTaskScheduler(2); return _BrowserTask; } } #endregion } }
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
{ if (_MainPageTask == null) _MainPageTask = new LimitedTaskScheduler(16); return _MainPageTask; } } #endregion #region 图片加载任务 private static LimitedTaskScheduler _LoadImageTask; /// <summary> /// 图片加载任务(32个线程) /// </summary> public static LimitedTaskScheduler LoadImageTask { get { if (_LoadImageTask == null) _LoadImageTask = new LimitedTaskScheduler(32); return _LoadImageTask; } } #endregion #region 浏览器任务 private static LimitedTaskScheduler _BrowserTask; /// <summary> /// 浏览器任务 /// </summary> public static LimitedTaskScheduler BrowserTask { get { if (_BrowserTask == null) _BrowserTask = new LimitedTaskScheduler(2); return _BrowserTask; } } #endregion } }
Form1.cs测试代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Management; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using Utils; namespace test { public partial class Form1 : Form { private TaskSchedulerEx _taskSchedulerEx = null; private TaskSchedulerEx _taskSchedulerExSmall = null; private TaskSchedulerEx _task = null; public Form1() { InitializeComponent(); _taskSchedulerEx = new TaskSchedulerEx(50, 500); _taskSchedulerExSmall = new TaskSchedulerEx(5, 50); _task = new TaskSchedulerEx(2, 10); } private void Form1_Load(object sender, EventArgs e) { } /// <summary> /// 模拟大量网络请求任务 /// </summary> private void button1_Click(object sender, EventArgs e) { DoTask(_taskSchedulerEx, 200000, 1000, 20); } /// <summary> /// 模拟CPU密集型任务 /// </summary> private void button2_Click(object sender, EventArgs e) { DoTask(_taskSchedulerEx, 100000, 2000, 1); } /// <summary> /// 模拟大量网络请求任务 /// </summary> private void button3_Click(object sender, EventArgs e) { DoTask(_taskSchedulerExSmall, 2000, 100, 20); } /// <summary> /// 模拟CPU密集型任务 /// </summary> private void button4_Click(object sender, EventArgs e) { DoTask(_taskSchedulerExSmall, 2000, 100, 1); } /// <summary> /// 模拟任务 /// </summary> /// <param name="scheduler">scheduler</param> /// <param name="taskCount">任务数量</param> /// <param name="logCount">每隔多少条数据打一个日志</param> /// <param name="delay">模拟延迟或耗时(毫秒)</param> private void DoTask(TaskSchedulerEx scheduler, int taskCount, int logCount, int delay) { _task.Run(() => { Log("开始"); DateTime dt = DateTime.Now; List<Task> taskList = new List<Task>(); for (int i = 1; i <= taskCount; i++) { Task task = scheduler.Run((obj) => { var k = (int)obj; Thread.Sleep(delay); //模拟延迟或耗时 if (k % logCount == 0) { Log("最大线程数:" + scheduler.MaxThreadCount + " 核心线程数:" + scheduler.CoreThreadCount + " 活跃线程数:" + scheduler.ActiveThreadCount.ToString().PadLeft(4, ' ') + " 处理数/总数:" + k + " / " + taskCount); } }, i, (ex) => { Log(ex.Message); }); taskList.Add(task); } Task.WaitAll(taskList.ToArray()); double d = DateTime.Now.Subtract(dt).TotalSeconds; Log("完成,耗时:" + d + "秒"); }); } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { if (_taskSchedulerEx != null) { _taskSchedulerEx.Dispose(); //释放资源 _taskSchedulerEx = null; } } } }
测试截图: