我做了一个蜘蛛程序,用多线程爬网页,使用命令行同步输出日志信息,在主线程中每隔20秒(Sleep)输出一次统计信息。
该程序运行几十分钟后就会莫名其妙地随机卡住不动,不光子线程不会继续工作和输出,主线程也不再输出任何信息了,就这么一直卡住不运行了,但窗口并没有失去响应。
调试里窗口里没有看到未被捕获的异常,出现过的异常都在可控范围内,不影响流程;任务肯定是没有完全完成,每个线程也都没完成当次分配的任务;就算某一个线程里的网页访问超时也不该影响其他的线程,况且也有超时时限的;线程只有一处用到锁,应该不是死锁问题,我尝试过155个线程同时运转一大段时间也是正常的。
我的线程都设为了后台线程,应该和这个无关吧,后台应该也不会被Windows忽略吧。
怀疑是命令行输出时卡住,不知有没有这个可能呢?命令行是否有输出行数上限?我正在测试定时清屏是否有效。
各位朋友能帮忙想想解决办法么?
adplus -hang -pn 蜘蛛测试.exe -quiet -o c:\dumps
5分钟之后,再运行一次
5分钟之后,再运行一次
抓到三组,就差不多了。一般而言,CPU和Memory都死水微澜,说明你的程序hang在某个请求上了,如socket的、如sql query execution等,在等待他们的返回。
从设计的角度讲,你的程序应该加一个timeout的。
无法确定你的问题,这个现成本来就是很麻烦的事情,控制不好就是你的这个样子,
大面上,你的这个用法,和大概的方法没有错。
有进入到死循环吧,没有代码也不好说、
sleep只是叫程序停下来一段时间,该卡的地方还是要卡的,如果要解决程序抢占主线程资源的情况可以考虑在繁忙的地方使用Application.Doevent()函数让程序处理在队列中等待的其它系统线程。
1、Visual Studio 不是可以选择不同的线程调试吗?一个个看看都执行到哪里发生什么事了?
2、这个纯瞎猜,试一下将 ThreadStart 提升成字段,不要直接 new Thread(new ThreadStart(...))