博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前台线程和后台线程
阅读量:5145 次
发布时间:2019-06-13

本文共 1470 字,大约阅读时间需要 4 分钟。

Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。 

一个线程是前台线程还是后台线程可由它的IsBackground属性来决定。这个属性是可读又可写的。它的默认值为false,即意味着一个线程默认为前台线程。我们可以将它的IsBackground属性设置为true,从而使之成为一个后台线程。 
下面的例子是一个控制台程序,程序一开始便启动了10个线程,每个线程运行5秒钟时间。由于线程的IsBackground属性默认为false,即它们都是前台线程,所以尽管程序的主线程很快就运行结束了,但程序要到所有已启动的线程都运行完毕才会结束。示例代码如下:

using System; 

using System.Threading; 
class MyApp 
    public static void Main() 
    { 
        for (int i = 0; i < 10; i++) 
        { 
            Thread thread = new Thread(new ThreadStart(ThreadFunc)); 
            thread.Start(); 
        } 
    } 
  
    private static void ThreadFunc() 
    { 
        DateTime start = DateTime.Now; 
        while ((DateTime.Now - start).Seconds < 5) 
            ; 
    } 
}

接下来我们对上面的代码进行略微修改,将每个线程的IsBackground属性都设置为true,则每个线程都是后台线程了。那么只要程序的主线程结束了,整个程序也就结束了。示例代码如下:

 

using System; 

using System.Threading;  
class MyApp 
    public static void Main() 
    { 
        for (int i = 0; i < 10; i++) 
        { 
            Thread thread = new Thread(new ThreadStart(ThreadFunc)); 
            thread.IsBackground = true; 
            thread.Start(); 
        } 
    }

  

    private static void ThreadFunc() 
    { 
        DateTime start = DateTime.Now; 
        while ((DateTime.Now - start).Seconds < 5) 
            ; 
    } 
}
既然前台线程和后台线程有这种差别,那么我们怎么知道该如何设置一个线程的IsBackground属性呢?下面是一些基本的原则:对于一些在后台运行的线程,当程序结束时这些线程没有必要继续运行了,那么这些线程就应该设置为后台线程。比如一个程序启动了一个进行大量运算的线程,可是只要程序一旦结束,那个线程就失去了继续存在的意义,那么那个线程就该是作为后台线程的。而对于一些服务于用户界面的线程往往是要设置为前台线程的,因为即使程序的主线程结束了,其他的用户界面的线程很可能要继续存在来显示相关的信息,所以不能立即终止它们。这里我只是给出了一些原则,具体到实际的运用往往需要编程者的进一步仔细斟酌。 

转载于:https://www.cnblogs.com/big-lll/p/7242995.html

你可能感兴趣的文章
Git 内部原理之 Git 对象哈希
查看>>
Vue中引入TradingView制作K线图
查看>>
爱历史 - 朝代歌
查看>>
【笔记】Cocos2dx学习笔记
查看>>
PHP设计模式之:单例模式
查看>>
c++输出缓冲区刷新
查看>>
Linux查看CPU和内存使用情况总结
查看>>
session丢失问题
查看>>
Python 批量修改root密码
查看>>
ThinkSNS+ 基于 Laravel master 分支,从 1 到 0,再到 0.1
查看>>
WEB服务器:Apache、Tomcat、JBoss、WebLogic、Websphere、IIS的区别与关系
查看>>
软件工程 speedsnail 冲刺7
查看>>
虚拟机CentOS设置IP
查看>>
Django之ORM多对多表创建方式,AJAX异步提交,分页器组件等
查看>>
Django 之 rest_framework 响应器使用
查看>>
7.Django CSRF 中间件
查看>>
luoguP3806 【模板】点分治1
查看>>
第八届蓝桥杯省赛真题--分巧克力
查看>>
.Net中的加密解密
查看>>
键盘布局
查看>>