`

(.net) 前台线程和后台线程的区别(转)

 
阅读更多

.Net中的线程,可以分为后台线程和前台线程。后台线程与前台线程并没有本质的区别,它们之间唯一的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。其实,说白了就是当前台线程都结束了的时候,整个程序也就结束了,即使还有后台线程正在运行,此时,所有剩余的后台线程都会被停止且不会完成.但是,只要还有一个前台线程没有结束,那么它将阻止程序结束.这就是为什么有些设计不够完美的WinForm程序,在某种特定的情况下,即使所有的窗口都关闭了,但是在任务管理器的管理列表里仍然可以找到该程序的进程,仍然在消耗着CPU和内存资源.因此,在WinForm程序中,关闭所有窗口前,应该停止所有前台线程,千万不要遗忘了某个前台线程.应用程序进程的存亡由前台线程决定而于后台线程无关.这就是它们的区别.线程默认为前台线程。
此外,改变线程从前台到后台不会以任何方式改变它在CPU协调程序中的优先级和状态。因为前台后线程与程序进程的优先级无关.
下面的代码示例对比了前台线程与后台线程的行为。创建一个前台线程和一个后台线程。前台线程使进程保持运行,直到它完成它的 while 循环。前台线程完成后,进程在后台线程完成它的 while 循环之前终止。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace TestBackgroundThread
{
    class Program
    {
        static void Main()
        {
            BackgroundTest shortTest = new BackgroundTest(10);
            Thread foregroundThread =
                new Thread(new ThreadStart(shortTest.RunLoop));
            foregroundThread.Name = "前台线程";

            BackgroundTest longTest = new BackgroundTest(50);
            Thread backgroundThread =
                new Thread(new ThreadStart(longTest.RunLoop));
            backgroundThread.Name = "后台线程";
            backgroundThread.IsBackground = true;

            foregroundThread.Start();
            backgroundThread.Start();

            //Console.ReadLine();   //不需要此行
        }
    }

    class BackgroundTest
    {
        int maxIterations;

        public BackgroundTest(int maxIterations)
        {
            this.maxIterations = maxIterations;
        }

        public void RunLoop()
        {
            String threadName = Thread.CurrentThread.Name;

            for (int i = 0; i < maxIterations; i++)
            {
                Console.WriteLine("{0} count: {1}",
                    threadName, i.ToString());
                Thread.Sleep(500);
            }
            Console.WriteLine("{0} finished counting.", threadName);
        }
    }
}

 

分享到:
评论

相关推荐

    前台线程后台线程区别实验

    在实验"前台线程后台线程区别"中,可能会涉及创建和管理这两种类型的线程,观察它们如何影响应用程序的关闭行为,以及如何通过代码控制线程的切换。可能的步骤包括: 1. 创建一个前台线程和一个后台线程,让它们...

    asp.net前台显示后台处理进度条

    总结起来,通过结合ASP.NET的UpdateProgress控件、UpdatePanel、Task和AJAX技术,我们可以实现在前台显示后台处理进度条的功能。这种方法不仅提高了用户体验,还避免了页面完全刷新带来的延迟感。在实际项目中,可以...

    .NET多线程详解

    ### 前台线程与后台线程 - **前台线程**:当应用程序的主线程结束后,所有前台线程也会被强制终止。只有所有前台线程都结束时,进程才会真正退出。 - **后台线程**:后台线程不会阻止进程的退出,即使它们仍在运行。...

    Visual Basic.NET线程参考手册

    后台线程(IsBackground=True)在所有前台线程结束后会自动结束,这对于执行非关键任务非常有用,因为它不会阻止程序的退出。 八、线程间的通信 VB.NET提供了多种线程间通信的方法,如WaitHandle(包括Mutex、...

    .Net 多线程详解

    • 前台线程与后台线程 • 名为BeginXXX和EndXXX的方法是做什么用的 • 异步和多线程有什么关联 WinForm多线程编程篇 • 我的多线程WinForm程序老是抛出InvalidOperationException ,怎么解决? • Invoke,...

    VB.NET 多线程 2010

    2. **后台线程与前台线程**:主线程(前台线程)是执行应用程序的初始线程,只有当所有前台线程都结束时,应用程序才会终止。而后台线程则不会阻止应用程序的关闭,它们在后台执行任务。 3. **Mutex 和 Semaphore**...

    谈谈在.NET下的多线程编程

    .NET框架的公共语言运行库(CLR)能够区分两种不同类型的线程:前台线程(Foreground Threads)和后台线程(Background Threads)。这两种线程的主要区别在于程序退出时的行为。 - **前台线程**:程序必须等待所有前台...

    .NET多线程编程教程,_NET多线程编程实例

    1.2 线程类型:主线程、工作线程、后台线程和前台线程。 1.3 创建线程:通过System.Threading.Thread类创建新线程,或者使用ThreadPool进行线程池管理。 二、线程同步与互斥 2.1 Monitor类:用于实现对象级别的互斥...

    asp.net多线程

    在多线程应用中,由于ASP.NET页面生命周期的限制,直接从后台线程更新UI是不允许的。通常,需要使用 `Page.RegisterAsyncTask` 或 `UpdatePanel` 等异步更新技术来实现页面部分的动态更新。 5. **异步编程与ASP.NET...

    visual basic.net 线程参考手册

    VB.NET中的线程分为前台线程和后台线程。前台线程由应用程序控制,只有当所有前台线程都结束时,程序才会终止。而后台线程一旦完成其任务,整个进程仍可继续运行。Thread类的IsBackground属性可以设置线程类型。 五...

    .net线程问答.net线程全攻略

    3. **前台线程与后台线程**:前台线程是应用程序的主要组成部分,直到所有前台线程都结束,应用程序才会退出。后台线程则不会阻止应用程序的关闭,当所有前台线程结束后,即使还有后台线程运行,进程也会结束。 4. ...

    权威.NET多线程详解(源码示例)

    ### 前台线程与后台线程 前台线程与应用程序的生命周期绑定,只要还有前台线程运行,应用程序就不会结束。后台线程则不阻止应用程序关闭,即使有后台线程还在运行。 ### BeginXXX和EndXXX方法 这些方法用于异步编程...

    (.net)线程详解

    后台线程则不会阻止应用程序退出,一旦所有前台线程结束,即使有后台线程在运行,也会结束程序。 4. **BeginXXX和EndXXX方法** 这些方法用于异步操作,BeginXXX启动异步操作,EndXXX则用于等待异步操作完成并获取...

    .Net线程详细介绍

    后台线程则不影响进程的生命周期,即使后台线程仍在运行,当所有前台线程结束时,进程也会结束。 ### 异步与多线程 异步编程并不等同于多线程。异步操作通常涉及I/O完成端口或回调,而多线程是利用多个执行上下文...

    权威.NET多线程详解(源码示例)[收集].pdf

    后台线程则在所有前台线程结束后自动终止,通常用于后台任务。 4. 异步与多线程: 异步编程通常通过回调或事件来处理结果,而多线程是同时执行多个任务。两者都能实现并发,但异步通常更高效,因为它不占用额外的...

    .net 线程详解 基础篇

    - 后台线程:不会阻止进程结束,当所有前台线程结束时,即使有后台线程运行,进程也会终止。 4. **BeginXXX和EndXXX方法**: - 这些方法用于异步操作,BeginXXX启动异步操作,EndXXX用于获取异步操作的结果,通常...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例).rar

    - **后台线程**:`IsBackground`属性可以设置线程为后台线程,当所有前台线程结束后,即使有后台线程还在运行,程序也会终止。 - **线程优先级**:`Priority`属性可以设置线程优先级,但并不保证绝对的执行顺序,...

    如何取消.net后台线程的执行

    这时我们需要一种较安全的方式来结束后台线程的运行,这样我们可以随时结束后台线程的运行,并且在线程结束时进行相应的资源清理工作(例如将内存数据写入硬盘)。.net框架提供了一些工具来实现该功能。 目录 ...

    .Net线程问题解答

    3. **前台线程与后台线程**:前台线程是支撑应用程序运行的线程,只要至少有一个前台线程活动,应用程序就不会退出。后台线程不阻止应用程序退出,一旦所有前台线程结束,即使有后台线程运行,应用程序也会终止。 4...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)-RFU9.rar

    后台线程(IsBackground 属性为 true)在所有前台线程结束后,即使任务未完成也会随进程一起结束,这对于执行非关键任务的线程很有用。 4. **线程间通信**:`WaitHandle`类(如`ManualResetEvent`、`AutoResetEvent...

Global site tag (gtag.js) - Google Analytics