当前位置:编程学习 > C#/ASP.NET >>

线程终止问题

我得思路是这样的:
我在主线程调用线程b和方法1
方法1调用线程a执行业务逻辑
b检测业务逻辑是否执行,如果业务逻辑没有执行,就调用方法1
代码大概就是:
          dosavefixedRepublish(siteid);    //方法1
          monitortrd = new Thread(new ThreadStart(this.monitorThread)); 线程b
                monitortrd.IsBackground = true;
                monitortrd.Start();
        //////////////////////

          dosavefixedRepublish(string siteid)//方法1
{
             newstrd = new Thread(new ThreadStart(this.republishPage));  线程a执行业务逻辑
            newstrd.IsBackground = true;
            newstrd.Start();
}
 private void monitorThread()线程b

        {
            while (true)
            {
 if (dt.AddMinutes(40).CompareTo(DateTime.Now) < 0)
                        dosavefixedRepublish(staticsiteid);//方法1

                    Thread.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()
  private void republishPage()
        {
            while (true)
            {
             try
                {
                    //ftp操作
                }
 catch (Exception ex)
                {
                    Thread.Sleep(5 * 60 * 1000);
                                    savePublicLogFiles("静态发布所有页面异常,可能是数据库异常", ex.Message , "");
                
                 }
              }
          }  
本来是没有线程b执行监控操作的,就靠republishPage这个死循环来执行静态发布。 但是仍然是大概过20几个小时就会线程异常终止。异常的抛出点是ftp链接异常,导致线程a终止。        
后来为了解决这个问题引入线程b,目的就是检查页面是否生成,
 DateTime dt = UpLoadFile.FileManageNew.getFileDate("", filename, ftpaddress, ref strMsg);
if (dt.AddMinutes(40).CompareTo(DateTime.Now) < 0) 
                        dosavefixedRepublish(staticsiteid);//方法1 


问题就是ftp运行几十小时后会异常终止。信息是,正在中止线程。
远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)


--------------------编程问答-------------------- 文件不可用
那问题应该是在你操作文件的部分发生的啊,你应该找那部分的原因。 --------------------编程问答--------------------
DateTime dt = UpLoadFile.FileManageNew.getFileDate("", filename, ftpaddress, ref strMsg); 
这个操作是在线程b执行的吧,检查一下是不是会异常啊。

--------------------编程问答-------------------- dosavefixedRepublish这个方法里报错了,导致线程终止了,估计,否则不应该会这样,你把这个方法加上trycatch,然后把错误打印出来,后台线程抛异常不不捕获的话,它就直接抛给了操作系统了,所以你看到的现象就是线程终止了但没报错,你可以查下系统日志看看有没有错。 --------------------编程问答-------------------- 异常都捕获了。并且都忽略了,目的就是为了实现死循环。譬如线程b,即使连接ftp发生异常,我也不希望线程b异常中止。已经加了try和catch了.

   monitortrd = new Thread(new ThreadStart(this.monitorThread)); 线程b 
                monitortrd.IsBackground = true; 
                monitortrd.Start(); 
        ////////////////////// 

private void monitorThread()线程b 

        { 
            while (true) 
            { 
                 try
                 {
                    if (dt.AddMinutes(40).CompareTo(DateTime.Now) < 0) 
                        dosavefixedRepublish(staticsiteid);//方法1 

                    Thread.Sleep(30 * 60 * 1000); 
                 }
                 catch(Eeception ex)
                 {
                   }
            } 
        } 
--------------------编程问答-------------------- 你的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); 
}
            } 
--------------------编程问答-------------------- 肯定是有操作出异常了 --------------------编程问答-------------------- 楼主已经捕获了所有异常了,但是是否有这种情况,某个错误发生后,线程会自己关闭后再抛出异常呢?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,