VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: hitone

C# 创建线程 线程处理完 利用return 返回 但系统句柄始终不释放 在线等大虾指教!

[复制链接]

0

主题

26

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-4-6 00:30:02 | 显示全部楼层
return就是自然结束吧,关键是return前要释放非托管的对象.在主线程Abort才是非正常结束.
回复

使用道具 举报

2

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-4-7 14:30:01 | 显示全部楼层
我测试发现 oService.SocketRun() 函数里面即使 不写任何代码 立即return ,句柄也不会释放。
回复

使用道具 举报

2

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-4-7 18:30:02 | 显示全部楼层
“调用GC.Collect()” 的方法我没有试,但是如果在主线程里面 不断的调用 GC.Collect是奇怪的啊
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-4-10 21:00:01 | 显示全部楼层
在实例 osThread 确认失效后才会回收句柄,你可以在oService.SocketRun 方法结束前利用事件抛给主线程,在主线程上(注意同步Invoke)结束线程,并只强制回收osThread就可以(osThread.dispose)。
回复

使用道具 举报

2

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-4-12 15:30:01 | 显示全部楼层
TO:btx221  C# Thread 对象没有 dispose 方法 啊。
回复

使用道具 举报

0

主题

8

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-4-13 13:45:01 | 显示全部楼层
这个不用管呀,系统会自动回收,
microsoft的自动回收就是做这个用的呀
回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-5-19 18:45:02 | 显示全部楼层
线程运行结束,会自动回收,本来这些工作都不用你管的,如果你硬要亲自回收,可以这样:
osThread=null;
GC.Collect();
回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-5-19 21:00:01 | 显示全部楼层
本来系统会自己管理的事,却要自己来做,我觉得没太大的意义..

个人意见,仅供参考..
回复

使用道具 举报

2

主题

29

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-5-23 14:45:01 | 显示全部楼层
其实我觉得这很正常,不是线程结束了,句柄就会立即消失.
以下是我的看法:
线程有自己的计数器和自己的上下文,当技术器=0时候,系统会释放资源.注意是系统管理,所以当中也有端时间.我们看os这本书经常能看到线程的3态,其实还有一态,称为僵尸态,也就是在linux下面的僵尸进程.其意思就是结束了,但是系统还没有释放资源,它的生命期就是这段时间.windows是多线程模型,它的线程和unix下面的进程作用基本相同.
回复

使用道具 举报

2

主题

29

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-5-23 16:45:01 | 显示全部楼层
你return只是说你放弃了对线程的作用权,此时的效果是计数器会-1.其他的什么也不作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表