前台线程和后台线程的理解

线程有两种:前台线程和后台线程。

区别是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。

主线程退出,不管后台线程有没有执行完,都会把后台线程结束掉:

 static void Main(string[] args)
        {
            Console.WriteLine("程序启动");
            Thread thread = new Thread(Worker);
            thread.Start();
            thread.IsBackground = true;
            Console.WriteLine("主线程退出");
            //Console.ReadKey();
        }

        static void Worker() {
            Thread.Sleep(1000);
            Console.WriteLine("后台线程退出");
        }

以上代码运行结果为:

首先通过Thread类创建了一个线程对象,然后通过IsBackground属性指明该线程为后台线程,启动了后台线程,主线程将会继续执行。主线程运行完毕之后就会中止后台线程,然后使整个程序结束运行。所以Worker不会执行。

但是最后有Console.ReadKey();后台线程会执行,因为Console.ReadKey()就是在等待,只要超过1秒即后台线程就会执行Worker。

在真正的开发环境中我们不可能通过加一句Console.ReadKey()来解决主线程退出后台线程还没执行这个问题,当然,我们还有其他的方法。

方法一:将创建的线程设置为非后台线程(前台线程),只需要注释backThread.IsBackground = true即可;其实不设置IsBackground属性,默认为前台线程。只有前台程序全部执行完才会退出程序。所以子线程的代码会被执行,但是这个时候一执行完马上就退出程序了。

代码和运行结果:

方法二:就是使主线程在后台线程执行完毕之后再执行,即使主线程也进入睡眠,且使睡眠时间比后台线程更长

代码和运行结果:

方法三:使用函数Join来实现,确保主线程会在后台线程结束后才开始运行

代码和运行结果:

使用Join的时候,主线程会等待后台线程结束之后才能继续执行。另外Join方法还有一个参数,表示等待多长时间。如果设置了时间,等了这个时间还没执行完就不会再等了。比如这里设置为500,那么就可能等不了子线程的执行了。

Demo链接:https://github.com/wangongshen/Wgs.CSDN.Demo2019

以下是C#中前台线程后台线程的举例: 1. 前台线程举例: ```csharp using System; using System.Threading; class Program { static void Main(string[] args) { Thread t = new Thread(new ThreadStart(CountNumbers)); t.Start(); for (int i = 1; i <= 5; i++) { Console.WriteLine("Main thread: " + i); Thread.Sleep(1000); } } static void CountNumbers() { for (int i = 1; i <= 5; i++) { Console.WriteLine("Child thread: " + i); Thread.Sleep(1000); } } } ``` 在这个例子中,我们创建了一个新的线程t,并在该线程上执行CountNumbers方法。在主线程中,我们打印了5个数字,并在每个数字之间暂停了1秒钟。在CountNumbers方法中,我们也打印了5个数字,并在每个数字之间暂停了1秒钟。由于我们在前台线程上执行CountNumbers方法,因此在主线程和子线程之间会交替打印数字。 2. 后台线程举例: ```csharp using System; using System.Threading; class Program { static void Main(string[] args) { Thread t = new Thread(new ThreadStart(CountNumbers)); t.IsBackground = true; t.Start(); for (int i = 1; i <= 5; i++) { Console.WriteLine("Main thread: " + i); Thread.Sleep(1000); } } static void CountNumbers() { for (int i = 1; i <= 10; i++) { Console.WriteLine("Child thread: " + i); Thread.Sleep(1000); } } } ``` 在这个例子中,我们创建了一个新的线程t,并在该线程上执行CountNumbers方法。我们将线程t设置为后台线程,这意味着当主线程退出时,线程t也会被强制终止。在主线程中,我们打印了5个数字,并在每个数字之间暂停了1秒钟。在CountNumbers方法中,我们打印了10个数字,并在每个数字之间暂停了1秒钟。由于我们在后台线程上执行CountNumbers方法,因此当主线程退出时,线程t也会被强制终止,因此只有前5个数字被打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小目标一个亿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值