• 关于Thread.IsBackground属性的理解


    关于Thread.IsBackground属性的理解

    C#中,Thread类有一个IsBackground 的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程。个人感觉这样的解释等于没有解释.

    .Net中的线程,可以分为后台线程和前台线程。后台线程与前台线程并没有本质的区别,它们之间唯一的区别就是:后台线程不会防止应用程序的进程被终止掉。呵呵,这句话读出来好像并不那么好懂.其实,说白了就是当前台线程都结束了的时候,整个程序也就结束了,即使还有后台线程正在运行,此时,所有剩余的后台线程都会被停止且不会完成.但是,只要还有一个前台线程没有结束,那么它将阻止程序结束.这就是为什么有些设计不够完美的WinForm程序,在某种特定的情况下,即使所有的窗口都关闭了,但是在任务管理器的管理列表里仍然可以找到该程序的进程,仍然在消耗着CPU和内存资源.因此,在WinForm程序中,关闭所有窗口前,应该停止所有前台线程,千万不要遗忘了某个前台线程.应用程序进程的存亡由前台线程决定而于后台线程无关.这就是它们的区别.

    知道了前后台线程的区别,就应该知道如何声明IsBackgroud属性的值了.

    值得说明的一点是:改变线程从前台到后台不会以任何方式改变它在CPU协调程序中的优先级和状态。因为前台后线程与程序进程的优先级无关.

    结束前摘录MSDN上一段示例码,以帮助大家便好的理解这一区别:

    下面的代码示例对比了前台线程与后台线程的行为。创建一个前台线程和一个后台线程。前台线程使进程保持运行,直到它完成它的 while 循环。前台线程完成后,进程在后台线程完成它的while 循环之前终止。

     1 using System;
     2 using System.Threading;
     3 
     4 class Test
     5 {
     6     static void Main()
     7     {
     8         BackgroundTest shortTest = new BackgroundTest(10);
     9         Thread foregroundThread = 
    10             new Thread(new ThreadStart(shortTest.RunLoop));
    11         foregroundThread.Name = "ForegroundThread";
    12 
    13         BackgroundTest longTest = new BackgroundTest(50);
    14         Thread backgroundThread = 
    15             new Thread(new ThreadStart(longTest.RunLoop));
    16         backgroundThread.Name = "BackgroundThread";
    17         backgroundThread.IsBackground = true;
    18 
    19         foregroundThread.Start();
    20         backgroundThread.Start();
    21     }
    22 }
    23 
    24 class BackgroundTest
    25 {
    26     int maxIterations;
    27 
    28     public BackgroundTest(int maxIterations)
    29     {
    30         this.maxIterations = maxIterations;
    31     }
    32 
    33     public void RunLoop()
    34     {
    35         String threadName = Thread.CurrentThread.Name;
    36         
    37         for(int i = 0; i < maxIterations; i++)
    38         {
    39             Console.WriteLine("{0} count: {1}", 
    40                 threadName, i.ToString());
    41             Thread.Sleep(250);
    42         }
    43         Console.WriteLine("{0} finished counting.", threadName);
    44     }
    45 }
  • 相关阅读:
    策略模式Strategy
    flex项目
    模板方法Template Method
    timer与ScheduledExecutorService
    java两个字符串的相似度
    一个简单的webshell
    状态模式State
    Java性能优化
    责任链模式China of Responsibility
    ns2.34下mflood协议的完美移植
  • 原文地址:https://www.cnblogs.com/pyffcwj/p/3069484.html
Copyright © 2020-2023  润新知