System.Timers.Timer 控制问题

wenquan_nn 2008-04-17 01:31:44
代码如下:
private System.Timers.Timer mytimer1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
{
count = 0;
Session["test"] = String.Empty;

mytimer1 = new System.Timers.Timer(2000);
mytimer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
mytimer1.AutoReset = true;
mytimer1.Enabled = true;
GC.KeepAlive(mytimer1);
}
}
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
count++;
Session["test"] += "第 " + count + " 秒<br>";
}

问题:
1、timer能准确执行timer1_Elapsed事件,但启动计时器以后不知道如何停止他
2、如果在同一浏览器中打开多个此页面,每打开一个,就会实例化一个新的计时器,同时旧的计时器仍在工作

不知道通过什么方法能够停止计时器或回收计时器?

望能得到有经验的开发者指点,谢谢!
...全文
250 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenquan_nn 2008-04-20
  • 打赏
  • 举报
回复
有经验的高手请指点!

谢谢啦!
wenquan_nn 2008-04-20
  • 打赏
  • 举报
回复
遇到一个新问题,在间隔时间内触发的事件不能访问,其他类定义的方法
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
SystemRules.TimerService timeSevise = new SupperCMS.SystemRules.TimerService();
timeSevise.TestSession();
}
经测试,在间隔时间内,程序并没有执行timeSevise.TestSession(),请问这是什么问题?
也不能执行本类的其他方法!
wenquan_nn 2008-04-17
  • 打赏
  • 举报
回复
需求是这样的:
1、定时获取某网站页面,判断是否有新的数据信息,如果有则获取,然后添加到数据库

2、这个功能可以通过后台来控制开启或停止

现在第一步没有问题,能够定时完成指定的任务,但不能即时的控制计时器的开启和停止,
只有关闭浏览器,计时器才会停止!

谢谢楼上的三点提议,但都不是很适合这个需求,原因是这个功能需要即时控制!
sdyqingdao 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wenquan_nn 的回复:]
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(Session["KG"].ToString().Equals("G"))
{
...mytimer1.Enabled = false;...
...不执行代码...
}
else
{
...mytimer1.Enabled = true;... //这样没有意义。需要你后台控制的时候执行这行代码
...指定间隔时间要执行的代码...
}
}

这个做法能暂时解决控制代码在什么时候执行,什么…
[/Quote]
youaskme 2008-04-17
  • 打赏
  • 举报
回复
楼主最好先说一下用定时器干什么用吧,你遇到了什么需求,这样能让大家更好的帮你分析解决方案
我觉得不一定要用.net提供的定时器,解决方案有多种,包括
1)利用javascript的setTimeOut方法,
2)在数据库端定时执行作业job
3)在服务器上写一个随服务器同时启动的服务

wenquan_nn 2008-04-17
  • 打赏
  • 举报
回复
想到一个不成理的办法:(手动设置一个开关)
//Session["KG"] 控制器开关 ...(大家别笑我...)
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(Session["KG"].ToString().Equals("G"))
{
...mytimer1.Enabled = false;...
...不执行代码...
}
else
{
...mytimer1.Enabled = true;...
...指定间隔时间要执行的代码...
}
}

这个做法能暂时解决控制代码在什么时候执行,什么时候停止,但还是做不到控制计时器这一步,
曾在代码中插入语句mytimer1.Enabled = false;(以上代码),计时器是停止工作啦,但不能
又不能再次启动,因为设置mytimer1.Enabled = false;后,计时器已经停止,不再执行timer1_Elapsed事件

谁有更好的办法能控制计时器开启或停止的不妨讨论下,期待你们的回复!
insus 2008-04-17
  • 打赏
  • 举报
回复
请使用Interlocked.Exchange来解决你的问题.

更多的参考:
http://msdn2.microsoft.com/en-us/library/system.threading.interlocked.exchange.aspx

如果还不明的,请以"Interlocked.Exchange"为关键词到google搜索一下.
叶子 2008-04-17
  • 打赏
  • 举报
回复
up
wenquan_nn 2008-04-17
  • 打赏
  • 举报
回复
由于控件生命周期的问题,不能通过单击事件执行 timer1.Enabled = false; ,系统会报一个空对象的错误

把timer编程一个session级别的变量,这个有考虑过,但不懂该怎么声明?能否提示点代码呢!
youaskme 2008-04-17
  • 打赏
  • 举报
回复
不知道楼主在b/s中的aspx页面用定时器干什么,
如果是在js中定时执行一个功能可以用
setTimeOut(执行脚本,时间间隔);
用后台的定时器timer问题比较大的
wenquan_nn 2008-04-17
  • 打赏
  • 举报
回复
自己顶一下,期待高手指点!
sdyqingdao 2008-04-17
  • 打赏
  • 举报
回复
1. timer1.Enabled = false; 就可以停止计时
2. 如果每个客户只能有一个计时器,那么需要把timer编程一个session级别的变量。这样只会实例化一个计时器。在C#中无须回收

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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