25.10 Foreground Threads versus Background Threads . 前台线程和后台线程
CLR将每个线程视为前台线程或者是后台线程。一个进程中的所有前台线程停止运行时,CLR强制终止仍在运行的任何后台线程。这些后台线程被直接终止:不会抛出异常。
因此,你应该用前台线程来执行你想完成的任务,比如把内存缓冲区的数据转移到磁盘(like flushing data from a memory buffer out to disk)。另外,应该为非关键的任务使用后台线程,比如重算电子表格的单元格,或者为记录建立索引。因为这些工作能在应用程序重启的时候继续,而且如果用户想终止应用程序,就没有必要强迫它保持活动状态。
CLR要提供前台和后台的概念来更好的支持AppDomain。每个AppDomain 都可以运行一个单独的应用程序,每个应用程序都有它自己的前台的线程。如果一个应用程序退出,造成它的前台线程终止,则CLR仍然需要保持活动并运行,使其他应用程序继续运行。所有应用程序都推出,它们的所有前台线程都终止后,整个进程就可以被销毁了。
下面的代码演示了前台和后台线程的差异:
using System; using System.Threading; public static class Program { public static void Main() { // Create a new thread (defaults to foreground) Thread t = new Thread(Worker); // Make the thread a background thread t.IsBackground = true; t.Start(); // Start the thread // If t is a foreground thread, the application won't die for about 10 seconds // If t is a background thread, the application dies immediately Console.WriteLine("Returning from Main"); } private static void Worker() { Thread.Sleep(10000); // Simulate doing 10 seconds of work // The line below only gets displayed if this code is executed by a foreground thread Console.WriteLine("Returning from Worker"); } }
在一个线程的生存期中,任何时候都可以从前台变成后台,或者从后台变成前台。应用程序的主线程,以及通过显式构造一个Thread对象的线程,都默认为前台线程。另一方面,线程池线程默认为后台线程。此外,由进入托管执行环境的本地(native)代码创建的任何线程都被标记为后台线程。
Important:要尽量避免使用前台线程。我有一次接手一个顾问工作,有个应用程序就是不终止。花了几小时研究问题后,才发现是一个UI组件显式地创建了一个前台线程(默认),这正是进程一直不终止的原因。后来修改组件来使用线程池,从而解决了问题。执行效率也提升了。
25.11 What's now 小结
在本章里,我想大家讲解了一些关于线程的基础知识,我也希望我让你明白了线程是非常宝贵的资源,必须省着用。为了做到这一点,最好的方式就是使用CLR的线程池。线程池自动为你管理线程的创建和销毁。线程池创建的一组线程将为各种任务而重用,所以你的应用程序其实只需几个线程即可完成全部工作。
在第26章中,我将会重点讲述如何使用CLR的线程池来执行计算限制(compute-bound)的操作。在第27章,我们将讨论如何将线程池和CLR的异步编程模型配合着使用,以执行I/O限制的操作。在许多情况下,你完全可以不需要线程同步,来执行异步的计算限制和I/O限制操作。但也有一些情况是必须进行线程同步的。在第28章(基元线程同步构造)和第29章(混合线程同步构造)中,我们将讨论线程同步构造的工作方式,以及各种构造之间的区别。
结束本章的讨论之前,我想告诉大家我全面接触并使用线程是从1992年Windows NT 3.1的第一个BETA版本开始的。.NET开始BETA测试时,我开始制作一个类库来简化异步编程和线程同步。这个库称为Wintellect Power ThreadingLibrary,可免费下载和使用。这个库有针对桌面CLR、Silverlight CLR和Compact Framework的版本。库、文档和示例代码的下载地址是http://Wintellect.com/PowerThreading.aspx。这个网站还包含了到一个支持论坛的链接。还可观看一些视频,它们演示了如何使用库的各个部分。
作者:石世特
出处:http://www.cnblogs.com/TivonStone/
希望本文对你有所帮助,想转随便转,心情好的话给我的文章留个链接.o(. .)o