`

(.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);
        }
    }
}

 

分享到:
评论

相关推荐

    .Net 多线程详解

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

    .NET多线程详解

    • 怎样创建一个线程 • 受托管的线程与 Windows线程 • 前台线程与后台线程 • 名为BeginXXX和EndXXX的方法是做什么用的 • 异步和多线程有什么关联

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

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

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

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

    .net 线程详解 基础篇

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

    使用.Net实现多线程经验总结

    1.简述  一般一个程序一个进程,代码是存在进程中的,进程本身不执行代码, 执行代码的是线程。  一般一个进程里就一个线程。(一个商店就一个老板娘。)  进程就是在内存中开辟了... 后台线程,只要所有的前台线程结

    NET面试题-多线程编程与线程同步1

    2. 为什么GUI不支持跨线程访问控件 3. 简述后台线程和前台线程的区别 4. 说说常用的锁,lock是一种什么样的锁 5. lock为什么要锁定一个参数,可

    多线程操作窗口源码2012813

    线程中处理数据,计算结果,然后在前台界面(GUI) 中更新显示。 在.NET Framework中,为了保证线程安全,避免出 现访问竞争等问题,是不允许跨线程访问窗体控件的。 如果强行访问,则会引发...

    asp.net知识库

    完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算...

    多线程操作窗口源码

    线程中处理数据,计算结果,然后在前台界面(GUI) 中更新显示。 在.NET Framework中,为了保证线程安全,避免出 现访问竞争等问题,是不允许跨线程访问窗体控件的。 如果强行访问,则会引发...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    系统分为前台Web界面、后台管理界面、站内搜索、监控客户端四个子系统。 大型互联网站由于访问量非常大,因此不是那些单纯用ASP.Net控件拖拽开发的开发人员能够开发的,也不是闭门造车能够造出来的,必须是在实际...

    asp.net面试题

    12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。 远程逻辑调用,remoing接口只能用在.net中 13.什么是code-behind技术 aspx and cs 14.概述三层结构体系 web/business/dataaccess 15...

    基于SSH的公司通用门户网站设计与实现.zip

    视频上传视频类型转换采用多线程技术后台自动转换。图片的上传采用无刷新的上传方式。 本文基于J2EE相关技术和B/S模式的MVC架构,使用SSH框架进行开发,合理运用设计模式,并遵循软件工程的开发思想,实现了预期的...

    CLR via C# 3rd Edition

    全新的一章,介绍了Windows支持线程的原因、线程开销、CPU动态、NUMA架构、CLR线程和Windows线程的关系、Thread类、使用线程的理由、线程调度和优先级、前台线程和后台线程。 Chapter 26-Performing Compute-Bound...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    25.10 前台线程和后台线程 25.11 继续学习 第26章 计算限制的异步操作 26.1 CLR线程池基础 26.2 执行简单的计算限制操作 26.3 执行上下文 26.4 协作式取消 26.5 任务 26.5.1 等待任务完成并获取它的结果 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    Asp.net基于ajax和jquery-ui实现进度条

    后台用一般处理程序处理相应,进度信息保存在HttpContext.Application中。  代码作为简单示例,实际应用时应对资源释放、防止多线程混乱等做进一步控制。 效果图:   代码: 前台: &lt;!DOCTYPE html&gt; &lt;...

    交换机路由器配置批量备份工具

    ssh telnet批量获取交换机路由器配置log工具,提供前台版和后台版 批量自动备份配置,自动删除过期log,支持多线程运行

Global site tag (gtag.js) - Google Analytics