有关线程的问题:线程不自动销毁,它不断增加

xupc 2003-09-09 04:25:55
代码很多,我给出关键示例代码
//第一个类
class clsB
{
void b2()
{
//在这里有一段用UDP通信的代码,有可能没有响应
}
public void b1()
{
Thread th1=new Thread(new ThreadStart(b2));
th1.start();
if(th1.Join(6000))//等待六秒
{
th1.Abort();
throw new Exception(...);//抛出异常
}
}
}
//第二个类
class clsA
{
public void a1()
{
try//忽略了所有错误
{
clsB classB=new clsB();//创建B类
classB.b1();
}
catch
{}
}
}

有一个定时器,每隔五秒定时触发过程 suba
void suba
{
for(int i=0;i<20;i++)
{
clsA cla=new clsA();
Thread Tha=new Thread(new ThreadStart(clsA.a1));
Tha.start();
}
}

现在的问题是运行这个程序后,线程一直不停地增加,不知何故?
...全文
360 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oceanson 2003-09-10
  • 打赏
  • 举报
回复
th1.Abort();写在fianlly中,探测事件写在try 中, 保证ip是否正常都关闭线程。具体方法有很多你参考一下把
laserman 2003-09-10
  • 打赏
  • 举报
回复
用异步通讯,不要用同步通讯。
xupc 2003-09-10
  • 打赏
  • 举报
回复
storm97(风暴不再):
xxx.Abort()也没有将线程终止掉

我是这样试的:我有五个IP要检测,即开了五个线程,有三个IP是正常的,我在调试的时候发现只有三个线程退出了,还有二个没有退出。
如果我把另外两个IP也改为正常的,那么有五个线程退出。

调用.Abort方法没有使线程退出。
xupc 2003-09-10
  • 打赏
  • 举报
回复
storm97(风暴不再) :
xxx.Abort()也没有终止线程,是这样的,我试了五个IP(即创建了五个线程),其中三个是正常的,我在调试的时候就只看到有三个线程退出了。其余二个没有退出,如果我把另外的二个IP也改为正常的话,那么可以看到有五个线程退出。

不知道调用.Abort()之后是否还要做别的处理。它没有终止这个线程。
xupc 2003-09-10
  • 打赏
  • 举报
回复
多谢列位
daou101 2003-09-09
  • 打赏
  • 举报
回复
关注!
storm97 2003-09-09
  • 打赏
  • 举报
回复
你的b1中的那个线程定义为Class的成员变量,在b1中启动他,然后在b2中监听端口的同时,当该端口监听时间到达指定时间时仍然没有相应的则关闭这个线程.xxx.Abort();如果得到相应作处理,再关闭。
xupc 2003-09-09
  • 打赏
  • 举报
回复
我试一下Threadpool

我用Sleep()的话,那么每次都要等这么久,而没有响应的机器比较少,那么将占用很多时间

我试了Interrupt(),还是没有用,在clsB的b2方法中有socket通信
bytes = udp.Receive(..)
如果对方没有响应它就死在这里了,
所以我
if(th1.Join(6000))//等待六秒

但是无法将这个线程强行结束掉。
storm97 2003-09-09
  • 打赏
  • 举报
回复
th1.Interrupt()试一下。
storm97 2003-09-09
  • 打赏
  • 举报
回复
为什么不用Sleep(Interval)来让他做等待呢?
xupc 2003-09-09
  • 打赏
  • 举报
回复
我发现问题了,是由于在clsB的b1中,如果b2没有响应,即到了设定的六秒,那么这个线程不会自动结束,调用th1.Abort(),也没有用。

请问用什么可以强行结束这个线程。
wolve 2003-09-09
  • 打赏
  • 举报
回复
这种事情,最好用threadpool来作
你检测的机子没反应,通过socket的超时来判断
wolve 2003-09-09
  • 打赏
  • 举报
回复
我的代码感觉有问题。其实你把线程处理封装到class clsB中,而在clasa clsA是启动就动就行了,另外,线程与socket的同步机制有时可能会产生死锁,这个地方也可能出问题。

th1.start();
if(th1.Join(6000))//等待六秒
这一句是什么意思啊
xupc 2003-09-09
  • 打赏
  • 举报
回复
呵呵,谢谢"风暴"兄。
我说明一下:
我不是让一个线程每隔五秒去做一件事,而是这样的,我从数据库中查出Ip地址,我要检测这些IP地址的主机状态。所以我对于每一个IP开一个线程去检测。
而我检测的时候有可能机器没有反应而死掉,所以我又另开了一个线程去检测,等待六秒如如没有响应那么认为它没有响应。

定时器的值我是随便写的,我试了不管定时器的值认为多少,线程还是会照样增加(不过是慢一些)
别外,我觉得线程应该是自动结束的吧,所以我只在b1()里调了 th1.Abort()()。
多谢赐教!
storm97 2003-09-09
  • 打赏
  • 举报
回复
我想不应该是每五秒就开起一个线程,你的过程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只是不停的新建线程而从来没有关闭过任何一个。

110,538

社区成员

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

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

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