dannyr's Blog
ColdFusion Delphi Flex Java .Net —— 一个都不能少!
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 93 文章- 3 评论- 316
如何关闭子线程?征集析构函数与多线程的讨论!
下面的代码是可以执行,大家都来说说为什么这个程序不会自动退出?
也就是说mian函数执行完毕后,为什么.net不会释放ThreadEx对象?
using
System;
using
System.Threading;
public
class
ThreadEx : IDisposable
{
private
Thread thread;
private
volatile
bool
bExit;
public
ThreadEx()
{
Console.WriteLine(
"
ThreadEx output
"
);
bExit
=
false
;
thread
=
new
Thread(OnThread);
thread.Start();
}
~
ThreadEx()
{
Console.WriteLine(
"
~ThreadEx output
"
);
bExit
=
true
;
}
private
void
OnThread()
{
while
(
true
)
{
if
(bExit)
{
break
;
}
Console.WriteLine(
"
Thread output
"
);
Thread.Sleep(
1000
);
}
Console.WriteLine(
"
Thread exit
"
);
}
private
void
Close()
{
bExit
=
true
;
}
public
void
Dispose()
{
//
TODO: 添加 ThreadEx.Dispose 实现
Console.WriteLine(
"
~Dispose output
"
);
bExit
=
true
;
}
static
void
Main()
{
ThreadEx threadEx
=
new
ThreadEx();
}
}
posted @ 2007-09-28 16:42
dannyr|一个都不能少!
阅读(2330)
评论(16)
编辑
收藏
所属分类:
.Net技术
发表评论
回复
引用
查看
#1楼
2007-09-28 16:47 |
绿蚂蚁
第二句main写错了
GC不会立即回收它的
回复
引用
查看
#2楼
[
楼主
]2007-09-28 16:53 |
dannyr|一个都不能少!
“第二句main写错了”
怎么解?
回复
引用
查看
#3楼
2007-09-28 17:04 |
henry
看过一本书说过托管代码下的释构函执行是不可控的
回复
引用
查看
#4楼
2007-09-28 17:06 |
XiaoFaye
调试时查看它的IL代码就知道发生什么事了。。。。
回复
引用
查看
#5楼
2007-09-28 17:34 |
Adrian H.
thread.IsBackground = true;
线程就会随着主线程关闭而关闭了。
回复
引用
查看
#6楼
[
楼主
]2007-09-28 17:46 |
dannyr|一个都不能少!
--引用--------------------------------------------------
Adrian H.: thread.IsBackground = true;
线程就会随着主线程关闭而关闭了。
--------------------------------------------------------
不错,可惜不能在析构函数里控制关闭线程,清理资源之类的动作,因为线程已经关闭了。
回复
引用
查看
#7楼
2007-09-28 18:39 |
瑞克
试试设置 threadEx 为 null。
然后调用GC的collect。
回复
引用
#8楼
2007-09-28 21:13 |
Kerry Jiang [未注册用户]
IsBackground = true
回复
引用
查看
#9楼
2007-09-28 21:48 |
Kingthy
你的代码里永远都还有线程在跑,所以threadEx一真在被引用着.所以就不会被回收掉,也就是永远没有调用到折构函数...
回复
引用
查看
#10楼
2007-09-28 21:52 |
Kingthy
而你的例子继承了IDisposable接口,Main里的代码改成这样就好多了.呵呵
using (ThreadEx threadEx = new ThreadEx())
{
}
还是@henry说的,折构函数是不可控的.它是在对象没有引用并GC回收此对象时才会调用的方法.
回复
引用
查看
#11楼
2007-09-28 22:43 |
大石头
非常简单,thread专门有一个异常,用于退出的。线程函数内,死循环内,捕获这个异常,一旦捕获,就退出循环,线程外部有专门的函数来引发这个异常。
简单一点的理解就是,我要你出错,出错时具体怎么做,由你自己处理。
回复
引用
查看
#12楼
2007-09-28 23:15 |
Adrian H.
--引用--------------------------------------------------
dannyr|一个都不能少!: --引用--------------------------------------------------
Adrian H.: thread.IsBackground = true;
线程就会随着主线程关闭而关闭了。
--------------------------------------------------------
不错,可惜不能在析构函数里控制关闭线程,清理资源之类的动作,因为线程已经关闭了。
--------------------------------------------------------
在外面调用Dispose来清理线程引用的对象。你敢完全依靠Finalize来清理?
回复
引用
#13楼
2007-09-28 23:39 |
fredchan [未注册用户]
private void OnThread(){
while(true){
if(bExit){
break;
}
Console.WriteLine("Thread output");
Thread.Sleep(1000);
}
Console.WriteLine("Thread exit");
}
其中,while(true){
if(bExit){
break;
}
Console.WriteLine("Thread output");
Thread.Sleep(1000);
}
一直在执行,因为对象一直在运行,因此不可能调用析构函数~ThreadEx()
这个问题比较低级
回复
引用
#14楼
2007-09-29 09:38 |
访客 [未注册用户]
private void OnThread(){
while(true){
if(bExit){
break;
}
Console.WriteLine("Thread output");
Thread.Sleep(1000);
}
Console.WriteLine("Thread exit");
}
上面的函数总是在执行,他不可能自动退出的
回复
引用
查看
#15楼
2007-09-29 11:20 |
徐少侠
基本同意13、14楼的意见
回复
引用
查看
#16楼
2007-09-29 11:41 |
亚历山大同志
代码逻辑的问题,不是析构的问题,完毕
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2007-09-28 17:51 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索
相关文章:
一个绝对有效的治疗“寻常疣(干日疮,瘊子)”的方法
吃薏米仁治好“寻常疣(干日疮,瘊子)”的案例请在此登记。
郑州Net俱乐部成立
【活动】沈阳地区新技术(WF,WCF)研讨与培训
相关链接:
所属分类的其他文章:
Net1.1添加目录共享,并设置访问权限
Access数据库的文本、备注数据类型的COLUMN_FLAGS说明
如何关闭子线程?征集析构函数与多线程的讨论!
function object(functor) ...
Dev GridControl的Outlook风格定制
WinForm MDI动态加载form
关于JSON
新的Visual Assist X的确很cool
求解(暂放.net主页,谢谢支持)
关于Flex、Tomcat、Jrun、ColdFusion、IIS、ASP.Net结合使用的误区!
最新IT新闻:
MySpace推自助广告平台MyAds
Facebook创始人:信息共享或存摩尔定律
微软承认Vista用户账户控制功能有问题
资本寒冬侵袭中国视频网站 营销春天或不远
金融风暴波及全球创业板 中国概念股难独善其身
公告
我的联系方式:
MSN dannyr@163.com
QQ 563178
20060606新计数器
Detail
<
2007年9月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
随笔分类
.Net技术(22)
(rss)
C++(9)
(rss)
ColdFusion(5)
(rss)
Delphi(2)
(rss)
DevExpress(1)
(rss)
Flex技术(29)
(rss)
Java(4)
(rss)
Laszlo(9)
(rss)
Spry(9)
(rss)
生活随笔(10)
(rss)
杂项(13)
(rss)
随笔档案
2008年6月 (1)
2008年5月 (2)
2007年9月 (2)
2007年8月 (1)
2007年7月 (3)
2007年1月 (1)
2006年12月 (2)
2006年11月 (1)
2006年10月 (6)
2006年9月 (1)
2006年8月 (4)
2006年7月 (1)
2006年6月 (4)
2006年5月 (4)
2006年4月 (2)
2006年1月 (1)
2005年12月 (1)
2005年11月 (1)
2005年10月 (2)
2005年8月 (1)
2005年7月 (1)
2005年6月 (1)
2005年5月 (1)
2005年4月 (1)
2005年3月 (2)
2005年2月 (1)
2005年1月 (3)
2004年12月 (9)
2004年11月 (9)
2004年10月 (9)
2004年9月 (3)
2004年8月 (2)
2004年7月 (6)
2004年6月 (4)
文章分类
ColdFusion
(rss)
Flex技术(3)
(rss)
文章档案
2004年6月 (3)
我的链接
Trademan
(rss)
www.k-zone.cn
(rss)
呼呼堂
(rss)
牛皮糖
(rss)
最新评论
阅读排行榜
1. 任意对象数组ArrayList的排序法(可自定义排序字段、排序方向)(8670)
2. ASP.NET动态加载用户控件的页面生成过程(8650)
3. 征集比较完善的权限管理方案!(最好有C#方案)(6286)
4. 关于上个Flex-Jsp-DB例子中Flex和Jsp传递中文参数问题的解决方法!(Tomcat服务器)(5780)
5. 贴个Flex-Jsp-Mysql简单结合例子(5481)
6. Flex2.0文件上传功能(Flex2.0正式版)(5414)
7. Flex RemoteObject 简单应用Demo(5209)
8. DeKlarit:一个不错的top-down CG工具(4639)
9. Rich Client Fashion(转载)+乱弹(4458)
10. Flex2.0实现文件上传功能(服务器为ASP.NET)(4031)
评论排行榜
1. DeKlarit:一个不错的top-down CG工具(24)
2. 关于上个Flex-Jsp-DB例子中Flex和Jsp传递中文参数问题的解决方法!(Tomcat服务器)(17)
3. Flex2.0实现文件上传功能(服务器为ASP.NET)(17)
4. 如何关闭子线程?征集析构函数与多线程的讨论!(16)
5. 神影无踪-廖添丁FlashGame(15)
6. 征集比较完善的权限管理方案!(最好有C#方案)(13)
7. 贴个Flex-Jsp-Mysql简单结合例子(11)
8. ASP.NET动态加载用户控件的页面生成过程(11)
9. 体验 Delphi2005's ECO II 空间技术(10)
10. Flex2.0文件上传功能(Flex2.0正式版)(10)