问题描述
我得思路是这样的:我在主线程调用线程b和方法1方法1调用线程a执行业务逻辑b检测业务逻辑是否执行,如果业务逻辑没有执行,就调用方法1代码大概就是:dosavefixedRepublish(siteid);//方法1monitortrd=newThread(newThreadStart(this.monitorThread));线程bmonitortrd.IsBackground=true;monitortrd.Start();//////////////////////dosavefixedRepublish(stringsiteid)//方法1{newstrd=newThread(newThreadStart(this.republishPage));线程a执行业务逻辑newstrd.IsBackground=true;newstrd.Start();}privatevoidmonitorThread()线程b{while(true){if(dt.AddMinutes(40).CompareTo(DateTime.Now)<0)dosavefixedRepublish(staticsiteid);//方法1Thread.Sleep(30*60*1000);}}现在问题是:正确运行大概24小时左右后,monitorThread好像突然终止了。我做的可是死循环啊。
解决方案
解决方案二:
有疑问者请跟贴或者和我qq联系,105163970急盼解决啊。
解决方案三:
不应该啊!
解决方案四:
是啊,我也奇怪的很了。自己本地调试一直都没有问题啊。
解决方案五:
你已经让线程Sleep呀
解决方案六:
是否和这个判断有关呢?if(dt.AddMinutes(40).CompareTo(DateTime.Now)<0)
解决方案七:
if(dt.AddMinutes(40).CompareTo(DateTime.Now)<0)这句你要干嘛。你把证实monitorThread停止的测试代码也贴出来看看,你给的这个部分太精简了
解决方案八:
从你描绘的情景来看,应该没什么问题,线程b不应该停止.既然问题出现,我就胡乱猜测:1、不明白你是怎么"检测业务逻辑是否执行"?2、dosavefixedRepublish(staticsiteid);//方法1执行失败,也就是我猜测,是不是创建线程失败?或者一直处于创建不出线程导致b线程挂住!3、this.republishPage没有执行完毕,线程挂住,累计,资源消耗完毕!!总的来说,你描绘的流程情景没问题,我以上3点归纳起来,就是怀疑你线程b内某一步(函数)处理有问题,导致b停止不执行。希望有帮助!
解决方案九:
线程b只是执行检查功能,方法1中的republishPage()是个反复链接ftp的操作。执行文件的上传功能。这个程序本身的目的是执行页面的静态化操作。republishPage()privatevoidrepublishPage(){while(true){try{//ftp操作}catch(Exceptionex){Thread.Sleep(5*60*1000);savePublicLogFiles("静态发布所有页面异常,可能是数据库异常",ex.Message,"");}}}本来是没有线程b执行监控操作的,就靠republishPage这个死循环来执行静态发布。但是仍然是大概过20几个小时就会线程异常终止。异常的抛出点是ftp链接异常,导致线程a终止。后来为了解决这个问题引入线程b,目的就是检查页面是否生成,DateTimedt=UpLoadFile.FileManageNew.getFileDate("",filename,ftpaddress,refstrMsg);if(dt.AddMinutes(40).CompareTo(DateTime.Now)<0)dosavefixedRepublish(staticsiteid);//方法1问题就是ftp运行几十小时后会异常终止。信息是,正在中止线程。远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)
解决方案十:
文件不可用那问题应该是在你操作文件的部分发生的啊,你应该找那部分的原因。
解决方案十一:
DateTimedt=UpLoadFile.FileManageNew.getFileDate("",filename,ftpaddress,refstrMsg);这个操作是在线程b执行的吧,检查一下是不是会异常啊。
解决方案十二:
dosavefixedRepublish这个方法里报错了,导致线程终止了,估计,否则不应该会这样,你把这个方法加上trycatch,然后把错误打印出来,后台线程抛异常不不捕获的话,它就直接抛给了操作系统了,所以你看到的现象就是线程终止了但没报错,你可以查下系统日志看看有没有错。
解决方案十三:
异常都捕获了。并且都忽略了,目的就是为了实现死循环。譬如线程b,即使连接ftp发生异常,我也不希望线程b异常中止。已经加了try和catch了.。monitortrd=newThread(newThreadStart(this.monitorThread));线程bmonitortrd.IsBackground=true;monitortrd.Start();//////////////////////privatevoidmonitorThread()线程b{while(true){try{if(dt.AddMinutes(40).CompareTo(DateTime.Now)<0)dosavefixedRepublish(staticsiteid);//方法1Thread.Sleep(30*60*1000);}catch(Eeceptionex){}}}
解决方案十四:
你的dt从哪里来的?
解决方案十五:
你的代码只有一段,怎么看啊,要么是线程发生异常,要么是主线程挂了
其他方案:
全部代码有1千多行。问题就是线程a调用的方法republishPage里面有ftp链接,其中ftp链接异常导致线程终止,从而导致创建线程a的监控线程b停止。我的用意是b永不停止。怎么解决这个问题啊?
其他方案:
up
其他方案:
把您调用ftp的代码贴出来
其他方案:
哎,不折腾了。线程b不掉用ftp了,直接没过十几个小时,强行更新得了。
其他方案:
republishPage逻辑错误会影响线程执行的.try..catch
其他方案:
while(true){try{if(dt.AddMinutes(40).CompareTo(DateTime.Now)<0)dosavefixedRepublish(staticsiteid);//方法1}finally{Thread.Sleep(30*60*1000);}}
其他方案:
肯定是有操作出异常了
其他方案:
楼主已经捕获了所有异常了,但是是否有这种情况,某个错误发生后,线程会自己关闭后再抛出异常呢?