C#定时器问题

hejunheng 2009-09-17 03:31:16
我用C#写了一个windosw服务,作用是每10秒扫描一次数据库,得到1000条数据,并将这1000条数据发送出去。

现在出现了一个问题:
第一次扫描到的1000条数据还没有处理现在,第二次扫描又开始了。
也就是说第二次扫描到了的数据和第一次有重复....
所以呀,怎么判断第一次的执行完没有呢?
timer.AutoReset这个是吗?
...全文
344 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyehanxinlei 2009-09-22
  • 打赏
  • 举报
回复
参考Mutex类的使用
  • 打赏
  • 举报
回复
楼主思路有点错误吧
hejunheng 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 neutroustroup 的回复:]
不建议使用lock方法来同步回调的方法,这样会导致类似于“死锁”的情况发生(MSDN描述说回调方法应该是可重入得),楼主说的情况,肯定会导致该服务“死”在那里。

楼主的实际情况会出现大量的timeelapsed的事件排队等候该回调函数处理,待排队到一定情况,服务根本没法处理这些事件。

应该是在方法处理时,关闭定时器,处理结束后再打开定时器(实际情况是,这样的间隔会大于10秒)。
另一种解决方法是:在回调方法中起线程去执行逻辑操作,然后在上层负责“同步和处理”这些操作的结果
[/Quote]
谢谢,第一种方法比较好,第二种没太明白.
cuiweifu 2009-09-21
  • 打赏
  • 举报
回复
这样的轮询....你还不如写个while呢.穿行的一定不会出这个问题!
LMTZ 2009-09-20
  • 打赏
  • 举报
回复
在timer2_Elapsed方法中
添加如下代码:

this.timer2.Enabled = false;
//执行你的业务操作
this.timer2.Enabled = true;
Neutroustroup 2009-09-20
  • 打赏
  • 举报
回复
不建议使用lock方法来同步回调的方法,这样会导致类似于“死锁”的情况发生(MSDN描述说回调方法应该是可重入得),楼主说的情况,肯定会导致该服务“死”在那里。

楼主的实际情况会出现大量的timeelapsed的事件排队等候该回调函数处理,待排队到一定情况,服务根本没法处理这些事件。

应该是在方法处理时,关闭定时器,处理结束后再打开定时器(实际情况是,这样的间隔会大于10秒)。
另一种解决方法是:在回调方法中起线程去执行逻辑操作,然后在上层负责“同步和处理”这些操作的结果
hejunheng 2009-09-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cgabriel 的回复:]
Object syncObj = new object();

lock(syncObj)
{
....
// do something
....
}
[/Quote]
我要保护的是整个方法怎么写呢?而不是对象
大意为:我知道不行,但是这个意思

lock
{
getDB();
}
hejunheng 2009-09-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cgabriel 的回复:]
引用 5 楼 hejunheng 的回复:
引用 4 楼 cgabriel 的回复:
用 lock 把 timer 里面的操作保护起来

能说详细点吗lock是什么


Object syncObj = new object();

lock(syncObj)
{
....
// do something
....
}

这样可以保证在 lock 包括的区域中的代码,在同一个时间,只会有一条线程在执行

可以避免 Timer 开的多条线程同步执行

[/Quote]
哎呀,太谢谢了,原来就是个关键字,
CGabriel 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hejunheng 的回复:]
引用 4 楼 cgabriel 的回复:
用 lock 把 timer 里面的操作保护起来

能说详细点吗lock是什么
[/Quote]

Object syncObj = new object();

lock(syncObj)
{
....
// do something
....
}

这样可以保证在 lock 包括的区域中的代码,在同一个时间,只会有一条线程在执行

可以避免 Timer 开的多条线程同步执行
hejunheng 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoyuzi 的回复:]
在timer_tick处理函数里开始把timer disable掉,等你扫描处理完毕再打开timer进行下一次操作
[/Quote]
没有明白,有例子吗?

private System.Timers.Timer timer2;
this.timer2 = new System.Timers.Timer();
((System.ComponentModel.ISupportInitialize)(this.timer2)).BeginInit();
this.timer2.Enabled = true;
this.timer2.Interval = 12000;
this.timer2.Elapsed += new System.Timers.ElapsedEventHandler(this.timer2_Elapsed);
hejunheng 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cgabriel 的回复:]
用 lock 把 timer 里面的操作保护起来
[/Quote]
能说详细点吗lock是什么
CGabriel 2009-09-17
  • 打赏
  • 举报
回复
用 lock 把 timer 里面的操作保护起来
csdn_风中雪狼 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 hejunheng 的回复:]
我用C#写了一个windosw服务,作用是每10秒扫描一次数据库,得到1000条数据,并将这1000条数据发送出去。

现在出现了一个问题:
第一次扫描到的1000条数据还没有处理现在,第二次扫描又开始了。
也就是说第二次扫描到了的数据和第一次有重复....
所以呀,怎么判断第一次的执行完没有呢?
timer.AutoReset这个是吗?
[/Quote]

不用定时吧,将每次读出来的数据处理完成后,才进行下一次扫描
xiaoyuzi 2009-09-17
  • 打赏
  • 举报
回复
在timer_tick处理函数里开始把timer disable掉,等你扫描处理完毕再打开timer进行下一次操作
hejunheng 2009-09-17
  • 打赏
  • 举报
回复
晕哟,我对csdn的.net高手表示怀疑

17,740

社区成员

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

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