请高手帮忙分析,timer的Elapsed事件不执行

xiaoyanwei2000 2011-08-15 10:38:07
cs程序,做服务器使用,应用到了多线程和线程池。程序的主要功能就是接受数据然后将数据保存到文本文件中,同时将数据转发到不同ip的服务器上。
出问题的timer(system.threading.timer)的功能是每2分钟执行一次,将接受到得数据写入文本。但是这个事件不定时的就会停止,一般会是在0点——8点之间(这个时间段能够接收到数据,但就是不写到文本文件中),过了这个时间段又会恢复正常,如果重新启动程序也会恢复正常,大家帮忙分析下出问题的原因在哪里,如何解决
...全文
370 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
scaleyuming 2013-12-04
  • 打赏
  • 举报
回复
朋友你这个问题找到原因了吗 ,我也碰到了
xiaoyanwei2000 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ustbwuyi 的回复:]
或许可以试试把代码放在Windows Service里然后部署看看会不会出错。
[/Quote]
这样改动就太大了
xiaoyanwei2000 2011-08-15
  • 打赏
  • 举报
回复
timer使用的也是线程池中的线程吧,会不会是这样的问题,线程池中的线程被占用完了,导致timer_elasped事件不能执行
ustbwuyi 2011-08-15
  • 打赏
  • 举报
回复
或许可以试试把代码放在Windows Service里然后部署看看会不会出错。
xiaoyanwei2000 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ustbwuyi 的回复:]
都放在try catch里都没捕捉到异常?
[/Quote]
没有异常
ustbwuyi 2011-08-15
  • 打赏
  • 举报
回复
都放在try catch里都没捕捉到异常?
xiaoyanwei2000 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ojlovecd 的回复:]
应该不是不执行,会不会是抛出异常了?
[/Quote]
没有抛出异常,所有代码都在try-catch中,而且为了确定他有没有执行我在方法中添加了标记,每次执行该方法都先把标记符号写入文本,但是问题时段没有标记文字,其它时段正常
isjoe 2011-08-15
  • 打赏
  • 举报
回复
如果程序忙,则system.threading.timer计时器有可能停止工作。。。。。。。

我姓区不姓区 2011-08-15
  • 打赏
  • 举报
回复
应该不是不执行,会不会是抛出异常了?
THG8888 2011-08-15
  • 打赏
  • 举报
回复
会不会是lock (syn)//syn是个只读的object类型实例
这地方有问题。直觉感应。供参考
xiaoyanwei2000 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dazhabai 的回复:]
把代码贴出来让大伙看看吧
[/Quote]

void timerScreen_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
//临时保存要写入文件的文本
string strText = string.Empty;
lock (syn)//syn是个只读的object类型实例
{
strText = sbData.ToString();//sbData是stringbulider类型实例,接受到得数据放入sbData
sbData.Remove(0, sbData.Length);
}

if (strText.Length != 0)
{
if (XmlControl.ReadXML("savealldata") == "1")
{
//保存原始数据,每小时1个文件
File.AppendAllText(string.Format("{0}{1}.hero", Application.StartupPath + "\\DataPacket\\AllData\\", DateTime.Now.ToString("yyyy-MM-dd HH")), strText);
}
if (XmlControl.ReadXML("savetemp") == "1")
{
//保存原始数据到临时文件,供入库程序使用
File.AppendAllText(string.Format("{0}{1}.hero", Application.StartupPath + "\\DataPacket\\AllData\\temp\\", DateTime.Now.ToString("yyyy-MM-dd HH mm ss")), strText);
}

}

lock (syn)
{
strText = controlData.ToString();//controlData是stringbulider类型实例,接受到得交互数据放入controlData
controlData.Remove(0, controlData.Length);
}

if (strText.Length != 0)
{
if (XmlControl.ReadXML("savetemp") == "1")
{
File.AppendAllText(string.Format("{0}{1}.hero", Application.StartupPath + "\\DataPacket\\交互命令\\", DateTime.Now.ToString("yyyy-MM-dd HH mm ss")), strText);
}
}
}
catch (Exception ex)
{
log.Error(ex);
}
txtContent.Text = "";
log.Error("刷屏标记");//将“标记”写入日志用来检测事件是否执行
}

dazhabai 2011-08-15
  • 打赏
  • 举报
回复
把代码贴出来让大伙看看吧
xiaoyanwei2000 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dazhabai 的回复:]
只要在使用 Timer,就必须保留对它的引用。 对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。 即使 Timer 仍处在活动状态,也会被回收。

是不是被回收了?
[/Quote]
什么意思?怎样保留对它的引用?什么情况下才会失去对timer的引用?
dazhabai 2011-08-15
  • 打赏
  • 举报
回复
只要在使用 Timer,就必须保留对它的引用。 对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。 即使 Timer 仍处在活动状态,也会被回收。

是不是被回收了?

110,535

社区成员

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

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

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