C#中的Thread.IsBackground的琢磨

摘要:
今天在执行一段前后台线程的时候,发现了我把线程全部都设置成了后台线程IsBackground=true,但是还是会执行后台线程,一直执行完后台线程。这是个小细节,稍不留神,就跳到坑里面了。

今天在执行一段前后台线程的时候,发现了我把线程全部都设置成了后台线程IsBackground = true,但是还是会执行后台线程,一直执行完后台线程。

代码如下:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Linq.Expressions;
usingSystem.Reflection;
usingSystem.Threading;

namespaceConsoleApp1
{
    classProgram
    {
        static void Main(string[] args)
        {
            //演示前台、后台线程
            BackGroundTest background = new BackGroundTest(10);
            //创建前台线程,默认创建的都是前台线程
            Thread fThread = new Thread(newThreadStart(background.RunLoop));
            //给线程命名
            fThread.Name = "前台线程";


            BackGroundTest background1 = new BackGroundTest(20);
            //创建后台线程
            Thread bThread = new Thread(newThreadStart(background1.RunLoop));
            bThread.Name = "后台线程";
            //设置为后台线程
            bThread.IsBackground = true;

            //启动线程
fThread.Start();
            bThread.Start();

            Console.ReadLine();
        }
    }
}
usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Threading; namespaceConsoleApp1 { public classBackGroundTest { private intCount; public BackGroundTest(intcount) { this.Count =count; } public voidRunLoop() { //获取当前线程的名称 string threadName =Thread.CurrentThread.Name; for (int i = 0; i < Count; i++) { Console.WriteLine("{0}计数:{1}", threadName, i.ToString()); //线程休眠1000毫秒 Thread.Sleep(1000); } Console.WriteLine("{0}完成计数", threadName); } } }

运行结果:

C#中的Thread.IsBackground的琢磨第1张

想要得到的结果理论上应该是 后台线程也不会运行了。

想了想,问题就应该出在最后一行代码:

Console.ReadLine();,它会让结果窗口一直不关闭,一直运行,窗口不关闭,后台线程也会一直运行,就会不停的打印结果.
把代码修改下,去掉了 Console.ReadLine();
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Linq.Expressions;
usingSystem.Reflection;
usingSystem.Threading;

namespaceConsoleApp1
{
    classProgram
    {
        static void Main(string[] args)
        {
            //演示前台、后台线程
            BackGroundTest background = new BackGroundTest(10);
            //创建前台线程,默认创建的都是前台线程
            Thread fThread = new Thread(newThreadStart(background.RunLoop));
            //给线程命名
            fThread.Name = "前台线程";


            BackGroundTest background1 = new BackGroundTest(20);
            //创建后台线程
            Thread bThread = new Thread(newThreadStart(background1.RunLoop));
            bThread.Name = "后台线程";
            //设置为后台线程
            bThread.IsBackground = true;

            //启动线程
fThread.Start();
            bThread.Start();
        }
    }
}


usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Threading;

namespaceConsoleApp1
{
    public classBackGroundTest
    {
        private intCount;
        public BackGroundTest(intcount)
        {
            this.Count =count;
        }
        public voidRunLoop()
        {
            //获取当前线程的名称
            string threadName =Thread.CurrentThread.Name;
            for (int i = 0; i < Count; i++)
            {
                Console.WriteLine("{0}计数:{1}", threadName, i.ToString());
                //线程休眠1000毫秒
                Thread.Sleep(1000);
            }
            Console.WriteLine("{0}完成计数", threadName);

        }
    }
}

再看运行结果:

C#中的Thread.IsBackground的琢磨第2张

就达到了预期的效果,前台线程运行完毕,后台线程尽管没运行完,也关闭了。

以后再写代码中要注意:
Console.ReadLine(); //这句话很重要,如果不注释掉这段代码,即使设置了 bThread.IsBackground = true,也没效果,因为前台线程还没结束,一直在执行,就不会停掉后台线程,后台线程会一直执行到结束。
这是个小细节,稍不留神,就跳到坑里面了。

免责声明:文章转载自《C#中的Thread.IsBackground的琢磨》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇QEMU1.3.0的源码分析三:user model之linuxToDoList下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python中多进程multiprocessing、多线程threading、线程池threadpool

浅显点理解:进程就是一个程序,里面的线程就是用来干活的,,,进程大,线程小 一、多线程threading 简单的单线程和多线程运行:一个参数时,后面要加逗号 步骤:for循环,相当于多个线程——t=threading.Thread(target=函数名,args=(参数,))——t.start()——while threading.active_coun...

java高并发解决方案

转载https://blog.csdn.net/GavinZhera/article/details/86471828 知识点 线程安全,线程封闭,线程调度,同步容器,并发容器,AQS,J.U.C,等等 高并发解决思路与手段 扩容:水平扩容、垂直扩容 缓存:Redis、Memcache、GuavaCache等 队列:Kafka、RabitMQ、Rocke...

python基础整理5——多进程多线程和协程

进程与线程 1.进程 我们电脑的应用程序,都是进程,假设我们用的电脑是单核的,cpu同时只能执行一个进程。当程序处于I/O阻塞的时候,CPU如果和程序一起等待,那就太浪费了,cpu会去执行其他的程序,此时就涉及到切换,切换前要保存上一个程序运行的状态,才能恢复,所以就需要有个东西来记录这个东西,就可以引出进程的概念了。 进程就是一个程序在一个数据集上的一次...

关于使用 VisualVM 进行性能分析及调优

概述 开发大型 Java 应用程序的过程中难免遇到内存泄露、性能瓶颈等问题,比如文件、网络、数据库的连接未释放,未优化的算法等。 随着应用程序的持续运行,可能会造成整个系统运行效率下降,严重的则会造成系统崩溃。 为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。 VisualVM 是一款免费的性能分析工具...

CAS导致的ABA问题及解决:时间戳原子引用AtomicReference、AtomicStampedReference

1.CAS导致ABA问题: CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并交换,那么在这个时间差中会导致数据的变化。 比如:线程1从内存位置V中取出A,这时线程2也从V中取出A,线程2进行了一些操作将值改成了B,然后线程2又将V的数据改回A;此时线程1进行CAS操作发现内存中仍然是A,然后线程1操作成功。 尽管线程1的CAS操作成功...

Android中的Handler机制

在android主线程中做太耗时的操作会引起ANR崩溃,为了进行线程间通信,就需要用到handler消息处理机制。消息传递分为两类,一种是从MainThread向WorkerThread传递消息,而另外一种是从WorkerThread向MainThread传递消息。由于主线程主要负责UI相关的事件,如用户的点击事件,屏幕触摸事件等,当捕捉到用户动作后将会分...