使用如下代码创建线程 
osThread = new Thread(new ThreadStart(oService.SocketRun));
osThread.Start();
oService.SocketRun 完成任务后利用 return 返回 
发现由于创建线程增加的 句柄并不释放,请问大虾们有何办法 释放句柄,或者是由什么其它方法由子线程自动 终止 ,而不需要通过父线程来终止? 多谢了

解决方案 »

  1.   

    oService.SocketRun 完成任务后当然线程也就结束了,osThread不为空也是正常的,这个需要等GC来回收的。
      

  2.   

    最好让线程自然结束,不用return
      

  3.   

    return就是自然结束吧,关键是return前要释放非托管的对象.在主线程Abort才是非正常结束.
      

  4.   

    我测试发现 oService.SocketRun() 函数里面即使 不写任何代码 立即return ,句柄也不会释放。
      

  5.   

    “调用GC.Collect()” 的方法我没有试,但是如果在主线程里面 不断的调用 GC.Collect是奇怪的啊
      

  6.   

    在实例 osThread 确认失效后才会回收句柄,你可以在oService.SocketRun 方法结束前利用事件抛给主线程,在主线程上(注意同步Invoke)结束线程,并只强制回收osThread就可以(osThread.dispose)。
      

  7.   

    TO:zhsu(不懂生活的人)  C# Thread 对象没有 dispose 方法 啊。
      

  8.   

    这个不用管呀,系统会自动回收,
    microsoft的自动回收就是做这个用的呀
      

  9.   

    线程运行结束,会自动回收,本来这些工作都不用你管的,如果你硬要亲自回收,可以这样:
    osThread=null;
    GC.Collect();
      

  10.   

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

  11.   

    你return只是说你放弃了对线程的作用权,此时的效果是计数器会-1.其他的什么也不作
      

  12.   

    线程使用后要记得释放资源:
    osThread.Close();  //or  osThread.Kill();
      

  13.   

    嘿嘿,不好意思,我把线程看成了进程。
    线程中断方法是这样的:
    osThread.Join();
    osThread.Abort();最好在线程开始前再加上这句:
    osThread.IsBackground=true;
    osThread.Start();
      

  14.   

    提醒下:
    线程变量最好是定义在另一个窗体或者模块里运行,这样在关闭那个窗体的事件里面:
    osThread.Join();
    osThread.Abort();
    并在窗体关闭后释放资源窗体资源:frm.Dispose();
    一般线程就会随之释放资源。
      

  15.   

    new出来的变量也能自动回收?
    你们搞错了吧。