WebService线程自动停止

atszpp 2010-04-20 11:05:31
在webservice中开了一个线程每10分钟一次循环调用某方法
当天运行正常,每次到晚上12点左右该线程会自动终止
请各位指导一下,什么情况下可能出现这种问题
...全文
516 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
atszpp 2010-04-26
  • 打赏
  • 举报
回复
还是用winform执行吧...
atszpp 2010-04-21
  • 打赏
  • 举报
回复
是这样的,这个Start()只有我才会去执行,而且打开一次是不会关闭的
是无限期循环执行的,除非要更新版本才关闭
判断线程终止是这样的:偶尔有一次在执行的时候日志里面记录“正在中止线程”
到后面就不执行了,我是这样想的,每10分钟执行一次
在执行的时候这个线程被中止,才会记录到日志
没有执行的时候就直接中止了,也不再执行了
现在就是不知道什么原因造成了这个线程的中止...
atszpp 2010-04-21
  • 打赏
  • 举报
回复
继续找问题...
zsuswy 2010-04-21
  • 打赏
  • 举报
回复
算了,友情再次路过一下。。。
-------
偶尔有一次在执行的时候日志里面记录“正在中止线程”
也就是说你不能重现这个问题????
那你光拿代码是看不出问题来的?如果是偶尔一次出现这个问题,那么原因可能有无数种。


还是那句话,其它不说,你这个代码本身还是有很大的问题。 我实在找不出一个合适的的理由把crmThread设置为静态变量。
zsuswy 2010-04-20
  • 打赏
  • 举报
回复
一个客户有可能无法Stop不了自己开启的线程,并且可能不小心结束掉别人开启的线程。
而且随着调用的增多,垃圾线程会越来越多,程序再改改吧。

最简单的处理方式就是把crmThread设置为成员变量,不要作为静态变量
zsuswy 2010-04-20
  • 打赏
  • 举报
回复
另外还有一种可能就是Start()方法被调用多次,线程会越积累越多,因为你这个Start()和Stop()看似成对,其实是有问题的:

因为private static Thread crmThread;
你这个crmThread是静态对象,看这种情况:

第一步:客户1,调用 Start
第二步:客户2,调用 Start
第三步:客户1, 调用 Stop
第四步:客户2, 调用 Stop

注意,客户1开启的线程是不会被结束的,因为第二步的时候,crmThread已经是指向 客户2开启的线程了(因为crmThread是静态变量)。第三步,客户1 去Stop的时候,其实是Stop的客户2开启的线程,相当于不小心Stop了客户2开启的线程(有可能这个就是你所谓的客户2的线程自动终止了),而且更严重的是客户1开启的线程永远不可能被停掉了。

这样你的web Service后台的线程有可能越来越多,直到崩溃!

你这个程序写得很有问题。。。。
皇城龙三 2010-04-20
  • 打赏
  • 举报
回复
你看看系统服务里面是不是相关服务自动关闭了
zsuswy 2010-04-20
  • 打赏
  • 举报
回复
我认为你这个东西不应该写在Web Service里面,而是应该写成一个windows service。不过也无所谓了,先不说这个。

这里代码看上去的确没有什么问题。
我看到你的代码里面有记录日志,我想问一下,这个线程自动终止时给出的异常是什么?有没有记录下来?还是说完全没有异常。

你是根据什么现象判断这个线程是自动终止了的?
atszpp 2010-04-20
  • 打赏
  • 举报
回复
真相如下:

private static Thread crmThread;

#region 自动发送
private void FaultStatusSendToCRMAuTo()
{
while (true)
{
try
{
//do something
}
catch (Exception ex)
{
//
}
finally
{
//writelog
}

Thread.Sleep(600000);
}
}
#endregion

#region 开始执行自动调用程序
[WebMethod]
public void Start()
{
crmThread = new Thread(new ThreadStart(FaultStatusSendToCRMAuTo));
crmThread.Start();
}
#endregion

#region 停止自动调用程序
[WebMethod]
public void Stop()
{
crmThread.Abort();
}
#endregion
段传涛 2010-04-20
  • 打赏
  • 举报
回复
这个问题太奇怪了。
贴代码
huminghua 2010-04-20
  • 打赏
  • 举报
回复
把代码贴出来,会不会是过时了呢?嘿嘿!
阿非 2010-04-20
  • 打赏
  • 举报
回复
为什么不做成 windows service
zsuswy 2010-04-20
  • 打赏
  • 举报
回复
无代码,无真相。。。。

把主要的代码贴出来。

12,165

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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