我想不应该是每五秒就开起一个线程,你的过程suba每次运行都会产生一个新的线程,
我想你的意思可能是需要让同一个线程每五秒去做一件事情,是不是这样的?如果是这样的,你要把:
 clsA cla=new clsA();
   Thread Tha=new Thread(new ThreadStart(suba));
   Tha.start();
放到另外一个函数中,在程序启动是调用他,而在void suba()中写上你要执行的任务.
你的程序的思路相当混乱,suba每五秒产生一个线程,而该线程会通过调用classB.b1();
产生另外一个线程,而你在b1()里的 th1.Abort();只是关闭了在b1中开起的那个线程,而没有将suba()中开起的相关线程关掉,况且你在suba中的线程是5秒执行一次任务,而在b1中却等待六秒,也就是b1中的那个线程还没有关闭,你这边suba又创建了一个新的。
   不停的增加主要的原因是suba只是不停的新建线程而从来没有关闭过任何一个。

解决方案 »

  1.   

    呵呵,谢谢"风暴"兄。
    我说明一下:
    我不是让一个线程每隔五秒去做一件事,而是这样的,我从数据库中查出Ip地址,我要检测这些IP地址的主机状态。所以我对于每一个IP开一个线程去检测。
    而我检测的时候有可能机器没有反应而死掉,所以我又另开了一个线程去检测,等待六秒如如没有响应那么认为它没有响应。定时器的值我是随便写的,我试了不管定时器的值认为多少,线程还是会照样增加(不过是慢一些)
    别外,我觉得线程应该是自动结束的吧,所以我只在b1()里调了 th1.Abort()()。
    多谢赐教!
      

  2.   

    我的代码感觉有问题。其实你把线程处理封装到class clsB中,而在clasa clsA是启动就动就行了,另外,线程与socket的同步机制有时可能会产生死锁,这个地方也可能出问题。th1.start();
          if(th1.Join(6000))//等待六秒
    这一句是什么意思啊
      

  3.   

    这种事情,最好用threadpool来作
    你检测的机子没反应,通过socket的超时来判断
      

  4.   

    我发现问题了,是由于在clsB的b1中,如果b2没有响应,即到了设定的六秒,那么这个线程不会自动结束,调用th1.Abort(),也没有用。请问用什么可以强行结束这个线程。
      

  5.   

    为什么不用Sleep(Interval)来让他做等待呢?
      

  6.   

    我试一下Threadpool我用Sleep()的话,那么每次都要等这么久,而没有响应的机器比较少,那么将占用很多时间我试了Interrupt(),还是没有用,在clsB的b2方法中有socket通信
    bytes = udp.Receive(..)
    如果对方没有响应它就死在这里了,
    所以我
      if(th1.Join(6000))//等待六秒但是无法将这个线程强行结束掉。
      

  7.   

    你的b1中的那个线程定义为Class的成员变量,在b1中启动他,然后在b2中监听端口的同时,当该端口监听时间到达指定时间时仍然没有相应的则关闭这个线程.xxx.Abort();如果得到相应作处理,再关闭。
      

  8.   

    storm97(风暴不再) :
    xxx.Abort()也没有终止线程,是这样的,我试了五个IP(即创建了五个线程),其中三个是正常的,我在调试的时候就只看到有三个线程退出了。其余二个没有退出,如果我把另外的二个IP也改为正常的话,那么可以看到有五个线程退出。不知道调用.Abort()之后是否还要做别的处理。它没有终止这个线程。
      

  9.   

    storm97(风暴不再):
    xxx.Abort()也没有将线程终止掉我是这样试的:我有五个IP要检测,即开了五个线程,有三个IP是正常的,我在调试的时候发现只有三个线程退出了,还有二个没有退出。
    如果我把另外两个IP也改为正常的,那么有五个线程退出。调用.Abort方法没有使线程退出。
      

  10.   

    th1.Abort();写在fianlly中,探测事件写在try 中, 保证ip是否正常都关闭线程。具体方法有很多你参考一下把