A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Always. 于 2013-9-24 23:25 编辑



我们知道.net程序中可以分为前台线程和后台线程,只有当所有的前程线程程序关闭了的时候才能完成程序关闭,而后台线程是指所有的前台线程结束的时候,后台线程自动结束。
当我们在运行的程序的时候,把程序突然关闭,结果也仍会出现,这是因为还有某一个前台线程没有结束。
而当我们把Thread.IsBackground的值设为True的时候,这时候把 程序关闭了,结果也不会出现。
我的疑问是:当程序执行了Thread.IsBackground=true的时候,就说明把前台线程都关闭了吗 ?但是Thread.IsBackground=true不是把线程设置为后台线程吗?执行后台线程的时候就可以把前台线程关闭吗 ?
我确实好混乱。。

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

7 个回复

倒序浏览
Thread.IsBackground=true当执行着句语句的时候,并不是把前台线程关掉,而是设定你当前的线程为后台线程了。
程序的执行时cpu会自动附加一个线程(其实是进程)叫做ui线程也就是主线程咯,这个线程是执行程序的,也就是说只要不结束你的主线程就永远存在。而如果自己新实例化了一个线程的话(也就是多线程),那么这个线程就是并发线程如果这时候你把这个线程设置为后台线程的时候,程序结束的时候该线程也会强制结束,如果是前台线程的话该线程在程序结束时(ui线程结束)前台线程还是在继续执行当前委托,并会返回结果。这个得结合图片理解最好。

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
补充一下,主线程结束的时候后台线程也就结束了哦
回复 使用道具 举报
图太难画了,老师视频里面有图的你仔细看看吧{:soso_e127:}
回复 使用道具 举报
Thread.IsBackground=true不是把前台线程关闭了,而是把某一个函数设置为在后台运行,也就是说前台的线程继续做它绘制页面的动作,新设置为后台线程的函数,在后台运行,和前台绘制界面的线程互不影响。这样就不会出现,当后台处理大批量数据的时候导致界面卡死。不明白的话继续和我交流

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
Thread.IsBackground=true不是把线程设置为后台线程吗?执行后台线程的时候就可以把前台线程关闭吗 ?
回答:
Thread.IsBackground=true是把线程设置为后台线程了,但是在关闭前台线程的时候,后台线程也会关闭,但是后台线程不是随着前台线程马上关闭,而是等一会再会关闭,此时,如果把前台线程关闭的时候,很有可能出现异常!这时解决的办法是:在你关闭前台程序的时候判断一下后台线程是否关闭。
比如针对此线程th.IsBackground=true;
在关闭前台程序的时候判断:
if(th!=null)  //如果后台线从没有关闭
{
          th.Abort();  //我们手动停止后台线程
}

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
举个视频中的例子,你是商店中的老板,你顾了一个人专门给你干一样活,你走了,在不加后台线程的情况下,那个人会继续干活直到完成才停下,而加了后台线程的情况下就相当与你通知了你的雇员你一走他就停下,不知道恰不恰当。

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
因为我们关闭ui进程太早,这时候后台进程还没运行完,所以显示不出结果。
当程序执行了Thread.IsBackground=true的时候,并没有把前台线程都关闭了,而是把前台线程变为后台线程。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马