一、前台线程和后台线程
一般情况下,显式创建的线程成为前台线程,线程池中创建的线程默认是后台线程。只要有一个前台线程还在运行,应用程序就仍然保持运行状态,而后台线程则不然。当所有前台线程结束时,应用程序就会停止,且所有的后台线程也随之终止。
可以通过线程的IsBackground属性来查询或修改线程的前后台状态
当前台线程都执行结束时,后台线程随之终止,且后台线程执行栈上的finally语句块都无法执行,如果finally里执行的是清理逻辑等,那么可以在应用程序结束时等待后台线程汇合(Join)来避免前面的问题,不过需要注意的是需要指定一个超时时间,来舍弃那些无法按时完成的后台任务,防止应用程序无法正常关闭。
二、设置线程的优先级
当多个线程同时运行,优先级就会变得很重要,因为有的线程可能需要更低的延迟(能够快速响应),比如一些UI进程,那么可以使用System.Diagnostics命名空间下的Process类来提高进程的优先级:
using(Process p = Process.GetCurrentProcess())
p.PriorityClass = ProcessPriorityClass.High;
该方法适用于一些工作量较少的线程,在计算密集,特别是带有用户界面的应用程序中,提高进程的优先级可能会抢占其他进程的执行时间,从而影响整个计算机的运行速度。
三、信号发送
线程间的消息通知即所谓的信号发送。
var signal = new ManualResetEvent(false);
new Thread(() =>
{
Console.WriteLine("等待信号");
signal.WaitOne()