C#.Net前台线程与后台线程的区别

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 弹出窗体Form2
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 _frm2 = new Form2();
            _frm2.Show();
        }

       
    }

 public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        Thread _Thread = null;

        private void Form2_Load(object sender, EventArgs e)
        {
            _Thread = new Thread(() => { while (true) { /*制造无限循环,等待用户关闭线程*/ } });

            _Thread.IsBackground = false;//false:设置为前台线程,系统默认为前台线程。
            //_Thread.IsBackground = true;//true:后台线程 

            _Thread.Start();
        }
    }

补充说明1:

private void Form2_Load(object sender, EventArgs e)
        {
            Thread _Thread = new Thread(() => 
            { 
                while (true) 
                { 
                    /*制造无限循环,等待用户关闭线程*/
                    this.BeginInvoke(new MethodInvoker(() => { this.Text = ""; }));
                    Thread.Sleep(3000);
                }
            });
            _Thread.IsBackground = true;
            _Thread.Start();  
        }

        //如果_Thread.IsBackground = true;为后台线程
        //场景1:打开Form1窗口后,立刻点击Button按钮弹出Form2窗口,此时Form2窗口中的线程已经启动了,
        //操作1:立刻关闭Form1窗口(主线程),此时不会出现任何的错误消息,同时资源管理器中ThreadDemo进程已经退出。
        //操作2:此时关闭Form2窗口,大概等待3秒后,程序会出现崩溃的消息,其原因是因为Form2窗口中的线程有操作UI的代码,而此时的Form2窗口已经关闭了(窗体对象已经释放)

    }

补充说明2:

 private void Form2_Load(object sender, EventArgs e)
        {
            Thread _Thread = new Thread(() =>
            {
                while (true)
                {
                    //if (this.IsHandleCreated)
                    /*制造无限循环,模型耗时的任务*/
                    this.BeginInvoke(new MethodInvoker(() => { this.Text = ""; }));
                    Thread.Sleep(3000);
                }
            });
            _Thread.IsBackground = false;
            _Thread.Start();
        }

        //如果_Thread.IsBackground = false;为前台线程
        //场景1:打开Form1窗口后,立刻点击Button按钮弹出Form2窗口,此时Form2窗口中的线程已经启动了,
        //操作(1):立刻关闭Form1窗口(主线程),大概等待3秒后,程序会出现崩溃的消息。
        //操作(2):此时关闭Form2窗口,现象和上面一样。
        //,其原因是因为Form2窗口中的线程有操作UI的代码而此时的Form2窗口已经关闭了(窗体对象已经释放)

        //此处如果程序不崩溃的话(if (this.IsHandleCreated)加上这句的话),则上面的两个操作可以在资源管理器中看到线程ThreadDemo一直存在进程中。

    }

如果想让上面的程序不崩溃可以使用:

  if (this.IsHandleCreated)
                    {
                        /*制造无限循环,模型耗时的任务*/
                        this.BeginInvoke(new MethodInvoker(() => { this.Text = ""; }));
                    }

 if (!this.IsDisposed ) 也是可以的。判断当前窗体是否已经释放。(备注:释放的窗体是不能操作界面UI元素的。)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

.net中的认证(authentication)与授权(authorization)

注:这篇文章主要给新手看的,老手们可能会觉得没啥营养,就请绕过吧。 “认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 认证(authenticat...

380100
来自专栏古时的风筝

ASP.NET-自定义HttpModule与HttpHandler

在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中...

32480
来自专栏飞扬的花生

ASP.MVC 基于AuthorizeAttribute权限设计案例

     ASP.MVC上实现权限控制的方法很多,比如使用AuthorizeAttribute这个特性 1.创建自定义特性用于权限验证 public clas...

25270
来自专栏ZKEASOFT

纸壳CMS的插件加载机制

纸壳CMS是基于插件化设计的,可以通过扩展插件来实现不同的功能。如何通过插件来扩展,可以参考这篇文章:

13720
来自专栏王磊的博客

缓存通用管理类 + 缓存 HttpContext.Current.Cache 和 HttpRuntime.Cache 的区别

  以前写asp.net时用HttpContext.Current.Cache存缓存很好用,今天写了一个windows服务程序,HttpContext.Curr...

39670
来自专栏跟着阿笨一起玩NET

System.Threading.Tasks.Task引起的IIS应用程序池崩溃

2. 从服务器端看(Windows Server 2008 + IIS 7.0),在事件日志中会出现Event ID为5010的错误:

34520
来自专栏跟着阿笨一起玩NET

无法将类型“System.Collections.Generic.IEnumerable<EmailSystem.Model.TemplateInfo>”隐式转换为“System.Collection

35410
来自专栏.net core新时代

分布式中使用Redis实现Session共享(二)

  上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原...

33160
来自专栏恰童鞋骚年

.NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

  关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认识即可。

13230
来自专栏更流畅、简洁的软件开发方式

一个保存数据的方法(可以切换存放的位置,可以设置密钥)

      在asp.net里面一般的生命周期都比较短,如果想要比较长久的保存数据的话,一般有选择几种方式可供选择,即cookies、ViewState、Ses...

290100

扫码关注云+社区

领取腾讯云代金券