网站群建设项目招标公告,中国建设银行企业网站首页,手机制作视频的软件哪个好,青海风控平台安卓版一. ThreadPool简介 ThreadPool简介#xff1a;ThreadPool是一个线程池#xff0c;当你需要开启n个线程时候#xff0c;只需把这个指令抛给线程池#xff0c;它将自动分配线程进行处理#xff0c;它诞生于.Net 2.0时代。 ThreadPool与Thread的区别#xff1a; ①#xf…一. ThreadPool简介 ThreadPool简介ThreadPool是一个线程池当你需要开启n个线程时候只需把这个指令抛给线程池它将自动分配线程进行处理它诞生于.Net 2.0时代。 ThreadPool与Thread的区别 ①Thread每开启一个异步任务就需要使用一个Thread具有专一性即使Thread已经死掉仍然需要占用资源。 ②ThreadPool能实现n个线程处理nm个异步任务且没有死线程默认都是初始化的。
二. 深究ThreadPool类
1QueueUserWorkItem方法将方法排入队列以便开启异步线程它有两个重载。 aQueueUserWorkItem(WaitCallback callBack)WaitCallback是一个有一个object类型参数且无返回值的委托 bQueueUserWorkItem(WaitCallback callBack, object state)WaitCallback是一个有一个object类型参数且无返回值的委托state即WaitCallback中需要的参数 不推荐这么使用存在拆箱装箱的转换问题影响性能。
使用方式 a严格的卡定义的写法第一个重载和第二个重载均是处理有一个参数的函数大于一个参数需要封装一个实体类所需参数在实体类的构造函数中引入然后调用第一个重载即可. 不推荐这种写法 通用写法 (可以处理任何参数个数的方法)这里不使用n即可。 ThreadPool.QueueUserWorkItem((n) { TestThread2(i.ToString(),i.ToString()); }); 通用写法的简化版 ThreadPool.QueueUserWorkItem(n TestThread2(i.ToString(), i.ToString())); 代码如下 2线程等待有局限性的 利用ManualResetEvent类和WaitOne方法,多个线程的话需要写for循环。 运行结果 3常用方法 a设置工作线程和IO线程的最大和最小值SetMaxThreads和SetMinThreads。 b获取工作线程和IO线程最大、最小、可用值GetMaxThreads、GetMinThreads、GetAvailableThreads。 测试结果 三. 扩展一个定时器功能
1RegisterWaitForSingleObject类但是不常用.涉及到定时任务建议使用Quartz.Net
2System.threading命名空间下的Thread类,通过查看源码构造函数中有四个参数第一个是object参数的委托第二个是委托需要的值 第三个是调用 callback 之前延迟的时间量以毫秒为单位 第四个是 调用 callback 的时间间隔以毫秒为单位 1 private void button12_Click(object sender, EventArgs e)2 {3 Stopwatch watch new Stopwatch();4 watch.Start();5 Console.WriteLine(----------------- button_Click 开始 主线程id为{0} --------------------------, Thread.CurrentThread.ManagedThreadId);6 7 #region 01-RegisterWaitForSingleObject8 //{9 // //每隔3s开启一个线程执行业务逻辑
10 // ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((obj, b)
11 // {
12 // //做逻辑判断编写业务逻辑
13 // Console.WriteLine(obj{0}tid{1}, datetime{2}, obj, Thread.CurrentThread.ManagedThreadId, DateTime.Now);
14
15 // }), hello world, 3000, false);
16 //}
17 #endregion
18
19 #region 02-Timer类
20 {
21 //2秒后开启该线程然后每隔4s调用一次
22 System.Threading.Timer timer new System.Threading.Timer((n)
23 {
24 //书写业务逻辑
25 Console.WriteLine(我是子线程中的业务逻辑哦);
26 }, 1, 2000, 4000);
27 }
28 #endregion
29
30
31 watch.Stop();
32 Console.WriteLine(----------------- button_Click 结束 主线程id为{0} 总耗时{1}--------------------------, Thread.CurrentThread.ManagedThreadId, watch.ElapsedMilliseconds);
33
34 }