C# 前台线程和后台线程的区别

本文详细解析了前台线程和后台线程的区别,包括它们在应用程序退出时的行为差异,以及如何通过IsBackground属性来切换线程类型。同时,介绍了线程的分类,包括个人构造线程(专用线程)和线程池线程,并推荐使用线程池线程以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前台线程和后台线程唯一区别:应用程序必须运行完所有的前台线程才会完全退出,若前台线程未执行完成,关闭应用程序后,应用程序并没有完全退出,在任务管理器中还存在此进程;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。

线程的分类

线程由程序员创建,可是创建的方式不同,总体来说有两种,一种是个人构造,也就是使用thread类new线程对象创建,这一类线程是大部分程序员知道的,也叫专用线程;还有一种是由CLR创建,这一类线程主要存在于线程池中,也叫线程池线程。对于这两种线程的好坏,个人建议最好使用线程池线程,不要大量使用专用线程,对于这一个问题的探讨,读者可以做研究,本文不做讨论

从回收的角度来看又可分为前台线程后台线程

  •   后台线程:后台线程是可以随时被CLR关闭而不引发异常的,也就是说当后台线程被关闭时,资源的回收是立即的,不等待的,也不考虑后台线程是否执行完成,就算是正在执行中也立即被终止。【后台,存在于黑暗之中默默无闻,它的消亡和存在,别人也感受不到】
  •   前台线程:前台线程是不会被立即关闭的,它的关闭只会发生在自己执行完成时,不受外在因素的影响。假如应用程序退出,造成它的前台线程终止,此时CLR仍然保持活动并运行,使应用程序能继续运行,当它的的前台线程都终止后,整个进程才会被销毁。

应该使用前台线程执行确实想要完成的任务,比如数据拷贝等:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;

class class1
{
    static void Main(string[] args)
    {
        Thread tmpThread = new Thread(WriteFile);//默认为前台线程
        tmpThread.Name = "TestThread";
        //tmpThread.IsBackground = true;
        tmpThread.Start();
    }

    /// <summary>
    /// 写文件
    /// </summary>
    static void WriteFile()
    {
        while (true)
        {
            using (FileStream fs = File.Open(@"D:\test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
            {
                byte[] buff = System.Text.UnicodeEncoding.UTF8.GetBytes(string.Format("Time:{0}\r\n", DateTime.Now.ToString()));
                fs.Write(buff, 0, buff.Length);
            }
            Thread.Sleep(10);
        }

    }
}

在上面的程序中我们使用了一个线程默认为前台线程,当控制台程序的Main函数执行完时,前台线程任然在写文件,如下如:

(1)在任何时候我们都可以通过线程的IsBackground属性改变线程的前后台属性

thread.IsBackground=false;前台线程

thread.IsBackground=true;后台线程

(2)应用程序的主线程以及使用Thread构造的线程都默认为前台线程

    线程池线程也就是使用 ThreadPool.QueueUserWorkItem()和Task工厂创建的线程都默认为后台线程
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值