如何确保子线程释放资源?高手请进!

bluemouse_1982 2003-04-23 04:21:24
我在主线程中创建一子线程:

......
Thread thread = new Thread( new ThreadStart(run) );
thread.start();
......

以下是子线程:
void run()
{
IntPtr handle = Marshal.AllocHGlobal( buffersize );
......
Marshal.FreeHGlobal( handle );
}

现在的问题是:主线程在子线程执行到最后一句前就已终止了,于是子线程也跟着终止,但其申请的资源并未释放。有没有办法确保子线程在任何情况下终止,都能释放它所申请的资源?
...全文
363 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Knight94 2003-04-24
  • 打赏
  • 举报
回复
那你把子线程的IsBackground打开,即设为true。
bluemouse_1982 2003-04-24
  • 打赏
  • 举报
回复
把线程放在后台会不会太慢了??
bluemouse_1982 2003-04-23
  • 打赏
  • 举报
回复
其实,thread.Abort会引发一个异常。在线程内将会捕捉到这个异常,因次可以写成这样
void run()
{
try
{
//进行操作
}
finally
{
//释放资源
}
}
但还有个问题,如果主线程是突然异常终止的,可能并未执行thread.Abort,这样也会抛出异常给子线程吗?

另外,我是在循环中创建线程的,无法保存句柄,该怎么办?
ArLi2003 2003-04-23
  • 打赏
  • 举报
回复
另外,在c# 据我所知,如果你建立了20 个线程(或者使用线程池)在某线程中止或正常完成时,是不是见到立即线程减少(还是20),而当你再次建新线程时会见到线程并没有增加(还是20)

比如有20 线程
其中一线程完成了
线程表还是20线程(比如任务管理器中见到的线程数)
再建一新线程
线程表还是20线程而不是21

估计是C# 的老问题,它的运行环境就好象 int[] i = new [5] 中的5一样,要先申请一个运行环境资源吧,整理和重用废旧才是它的大学问

至于线程资源可以使用 abort 和join 是会释放的,其实不使用它也会释放,只是不会马上减少,这个问题和是否多线程无关
ArLi2003 2003-04-23
  • 打赏
  • 举报
回复
写错了,是 thread.Abort
ArLi2003 2003-04-23
  • 打赏
  • 举报
回复
thread.About
thread.Join
Knight94 2003-04-23
  • 打赏
  • 举报
回复
最好保存一下子线程句柄,用其的Join(),就可完全释放。

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧