注:
1、WaitHandle同样可以用于new创建线程的同步事件;
2、WaitHandle等待方法(WaitAll、WaitAny)的数组长度的数目必须少于或等于 64 个,为了解决此限制,有网友封装了一个类,比较好用:
1、线程有前台线程和后台线程之分,使用new创建的线程默认为前台线程(可以使用IsBackground属性来进行更改),线程池里面都是后台线程
前台线程:前台线程是不会被立即关闭的,它的关闭只会发生在自己执行完成时,不受外在因素的影响。假如应用程序退出,造成它的前台线程终止,此时CLR仍然保持活动并运行,使应用程序能继续运行,当它的的前台线程都终止后,整个进程才会被销毁。
后台线程:后台线程是可以随时被CLR关闭而不引发异常的,也就是说当后台线程被关闭时,资源的回收是立即的,不等待的,也不考虑后台线程是否执行完成,就算是正在执行中也立即被终止。
2、线程被系统调度到CPU执行时存在优先级:这里的优先级不是优先执行,而是被调度到CPU执行的概率高;使用new创建线程与线程池的优先级默认都是Normal,不过前者可以通过Priority属性来设置优先级。优先级有5个级别:Highest、AboveNormal、Normal、BelowNormal和Lowest。
3、线程存在Suspend与Resume这两个过时的方法,但不是代表不能使用,只是微软不推荐你用,MSDN给出的原因是:请不要使用 Suspend 和 Resume 方法来同步线程活动。 没有办法知道当你暂停执行线程什么代码。 如果在安全权限评估期间持有锁,您挂起线程中的其他线程 AppDomain 可能被阻止。 如果执行类构造函数时,您挂起线程中的其他线程 AppDomain 中尝试使用类被阻止。 可以很容易发生死锁。你可以无视这个警告继续使用这两个方法进行线程同步,若觉得不怎么靠谱,那么可以程代码加入判断来保证执行正确性,或者使用控制同步事件(AutoResetEvent等)来实现线程同步。
4、线程池的线程很珍贵,因为数量是有限的,所以不适合执行长时间的作业任务,适合执行短期并且频繁的作业任务,若想执行长时间的作业任务,建议使用new创建新线程的方式。毕竟线程池设计的初衷就是为了解决频繁创建与撤销线程而造成的资源浪费。多线程死锁的例子
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-74428-3.html
虽然现在美国也是这么做的
不卡