none
如何快速,安全的终止线程? RRS feed

  • 问题

  •    我写了一个网络服务,在Onstart方法中,使用了子线程来开启:
       dim tStartThread as new threading.thread
       tStartThread.start

       在ONStop方法中,使用 tStartThread.abort来终止线程,但是实际情况是,在服务管理里面点击停止按钮后,虽然服务关闭的进度条一闪就过去了,但是在任务管理器中我的服务进程并没有退出,而是等了10来秒中才真正退出.
       网上查了一些资料,总结下来,可能是因为子线程里面的网络传输部分阻塞了线程,导致进程没法及时退出.

       现在面临两个问题:
       1:有没有办法使服务关闭的进度条真正指示线程的退出状态,也就是等到整个进程真正退出了,进度条才最终关闭?
       我试过:
       tStartThread.abort
       tStartThread.join
       可是进度条接近完成的时候报错.
       2:最主要的是,有没有办法使整个服务安全,快速的退出?网上有说用TerminateProcess() API的,可是有可能造成内存泄露.不知道.net本身有没有方法实现呢?
    2009年9月5日 5:35

答案

  • 您好,
    尝试设计一个共享类包含一个共享属性,在onstop方法中设置该属性,在for循环中判断该属性,如果对则退出。
    对于客户端是否可以设计超时操作来增强体验。
    • 已标记为答案 picat 2009年9月5日 12:26
    2009年9月5日 10:57

全部回复

  • 您好,个人思路请参考:
    1、如果采用ThealPool来管理线程,则可以通过GetMaxThreads和GetAvailableThreads来计算当前活动的线程数,直到值为0,才结束ONStop方法。(网络的传输是必等,当然也可考虑设计超时时间策略来减少等待时间。我想不要太在意缩短或强制结束线程,更重要的是安全退出)
    2、如果不是采用ThealPool,则需自行设计一个共享集合类,记录线程的活动数,相信会增加复杂度。
    2009年9月5日 9:07
  •   Jiyuan 你好:
      谢谢上面的回复,我用的是单独的子线程,采用循环监听的方式接受客户端的链接(TCPlistener.AcceptTcpClient).我这边有个别人开发的功能类似的程序,退出是相当快的(我知道他们使用VC++6.0写的),我不知道是.net本身的机制造成的退出过慢还是我自己的代码有问题,我在onstop方法中仅仅是调用了tStartThread.abort方法来结束进程,我不知道是不是要自己写个重载的abort方法来添加一些对象关闭或销毁的代码来加快服务的关闭?
      此外,我想加快服务关闭的速度的原因是:远程的客户端有重启本服务的功能,如果退出过慢,可能会出现客户端的连接已经断开,但是服务端的进程还没退出,造成客户端一直连不上服务端的假象,影响客户端使用者的使用体验.
    2009年9月5日 10:12
  • 您好,
    尝试设计一个共享类包含一个共享属性,在onstop方法中设置该属性,在for循环中判断该属性,如果对则退出。
    对于客户端是否可以设计超时操作来增强体验。
    • 已标记为答案 picat 2009年9月5日 12:26
    2009年9月5日 10:57
  •   谢谢,原来是我在OnStop的时候没有将TCPlistener先关闭造成的.
      你的思路我尝试过,好像不行,因为TCPlistener.AcceptTcpClient在没有接收连接请求的时候一直是阻止状态,所以就算设置了共享属性,在有新的客户端连接请求进来之前循环是没有办法进行的.当然如果服务端的连接请求非常频繁的时候这个方法还是可行的.
     
    2009年9月5日 12:26
  • 有道理,服务结束时是需要关闭这些昂贵的资源。
    哈,这样沟通挺不错,我亦有收获。
    2009年9月5日 14:13