zoukankan      html  css  js  c++  java
  • CLR_via_C#.3rd 笔记[25.10 前台线程和后台线程]

    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。这个网站还包含了到一个支持论坛的链接。还可观看一些视频,它们演示了如何使用库的各个部分。

  • 相关阅读:
    数据攻略●R语言自述
    测试实例
    xml反射
    过滤器
    使用s标签来进行简单的表格配置
    将Spring、Hibernate、Struts2连接起来
    Spring容器
    初见Spring框架
    Spring框架的AOP
    Hibernate里面的几个方法
  • 原文地址:https://www.cnblogs.com/TivonStone/p/1826808.html
Copyright © 2011-2022 走看看