我在实验中发现在 ASP.NET 中可以使用计时器(Timer)完成一些定时动作。这一点可能会对我们的一些 Web 程序有益。
下面首先介绍我测试使用的一个例子:
- 首先在 global.asax 中的 Application_OnStart 事件过程中定义计时器,代码如下:
[VB.NET] global.asax
<%@ import Namespace="System.Timers" %>
<script runat="server">Sub Application_OnStart(sender As Object, e As EventArgs)
' 创建一个计时器,单位:毫秒
Dim aTimer As New System.Timers.Timer(10000)' 将 Fresher 指定为计时器的 Elapsed 事件处理程序
AddHandler aTimer.Elapsed, AddressOf Fresher' AutoReset 属性为 true 时,每隔指定时间循环一次;
' 如果为 false,则只执行一次。
aTimer.AutoReset = True
aTimer.Enabled = True
' 先给 Application("TimeStamp") 指定一个初值
Application.Lock()
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock()
End SubSub Fresher(sender As Object, e As ElapsedEventArgs)
Application.Lock()
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock()
End Sub</script>
- 然后我们简单写一个 test.aspx 来查看 Application("TimeStamp") 的值。代码如下:
[VB.NET] test.aspx
<%
Response.Write(Application("TimeStamp"))
%>
分析:
根据 global.asax 中的代码,我们设定了一个计时器,每隔 10 秒钟执行一次 Fresher() 过程;在 Fresher() 过程中我们事实上只是重新写入了一个 Application("TimeStamp") 新值。换句话说,Application("TimeStamp") 的值是应该每隔 10 秒钟更新一次的。
是不是这样的呢?通过 test.aspx 的反复刷新观察 Application("TimeStamp") 的值,的确发现这个值在每隔 10 秒地变化一次,而其他时候则保持不变。与我们的预期是一致的。
意义:
通过引入计时器我们可以在 ASP.NET 的全局性程序(Application)中灵活的使用计时器完成一些定时操作,比如:在社区/论坛系统中,每隔 5 分钟更新一次在线用户列表,每隔 1 个小时更新一次用户经验值,或者每隔一天备份一次关键数据等等。这个思路应该是很诱人的。
探讨:
Q: 是否在 ASP.NET 代码的任何地方都可以使用计时器呢?
A: 我没有测试过在普通 *.aspx 中插入计时器的情形。但从 B/S 程序的特点来看,即使在 *.aspx 中插入计时器可行,也不是一种好的选择。因为对于 B/S 程序来说,服务器接到客户端的请求本身就是一个事件,在这个事件处理过程中,服务器必须迅速的作出回应,为客户端产生相应的 HTML 代码,然后结束这一过程。如果在 *.aspx 使用计时器(如果允许的话),则第一没有太大必要,第二很容易使系统因为插入的计时器过多(因为每一次 *.aspx 的执行都有可能插入一个新的计时器)而使系统瘫痪。
因此,我建议只在 global.asax 的 Application_OnStart 中使用比较安全一些。欢迎对此感兴趣的朋友对此发表见解。
(转载请注明出处)
打印 | 张贴于 2003-10-23 20:06:00 | Tag:暂无标签
留言反馈
至于那些要在页面显示时间的低级问题表拿来这里讨论
必须一次完成页面的创建后 页创造者(系统服务)将创建的页面发给
客户端浏览器
如果你在页面的 一些 处理过程中使用
将使 页创造者(系统服务) 一致等待页面的完成
必然死机
对于操作一个过程会出现变成假定时器了
但是,我发现,我timer的Elapsed事件会执行一次或有限的多次就会自动停止。而且在timer的Elapsed事件加入数据库读取操作(在一个类中),或者复杂一些的判断操作,timer的Elapsed事件一次都不能执行!
以上问题怎样解决,请赐教!
邮件:
ytl_zy@yahoo.com.cn
13760242309
谢谢!
我的思路是定时执行函数时,先看log文件夹里有没有错误日志,如果有就把它给读出来,然后作为邮件的内容发送出去。但是这样看起来似乎不行。跟踪调试的时候发现代码在第一行就停了,我把时间间隔改为10s还是不行的,根本就没有执行代码。谁能给个解释或者给出解决方案啊
有人说写一个服务或者用计划任务,我觉得对于web程序来说都不是太好的。
具体如下:
在page_load事件中动态创建了些控件,放到panel中:
if (!IsPostBack){
if(满足条件1){
Literal myliteral = new Literal();
Literal myliteralB = new Literal();
CheckBoxList myck = new CheckBoxList();
MyPanel.Controls.Add(myliteral);
MyPanel.Controls.Add(myck);
MyPanel.Controls.Add(myliteralB);
}
else{
Response.Write(Alert("...."));
donothing();
}
}
第一次load page时,条件1满足,控件创建完毕;之后page load,则条件1不满足。我希望不改变动态创建的页面的内容;但目前当用户按refresh页面按钮时,动态创建的控件消失了。
我也是无法执行对数据库的操作,保存的Application倒是可以,代码:
protected void Application_OnStart(Object sender, EventArgs e)
{
System.Timers.Timer aTimer = new Timer(3000);
aTimer.Elapsed += new ElapsedEventHandler(aTimer_Elapsed);
aTimer.AutoReset = true;
aTimer.Enabled = true;
Application.Lock();
Application["aTimer"] = 1392;
Application.UnLock();
}
private void aTimer_Elapsed(object source, ElapsedEventArgs e)
{
Application.Lock();
Application["aTimer"] = Convert.ToInt32(Application["aTimer"]) + 1;
Application.UnLock();
Advert advert = new Advert(new DBHelper());
advert.Delete(Convert.ToInt32(Application["aTimer"]));
}
我的timer1_Elapsed过程:
System.DateTime currentTime=new System.DateTime();
currentTime=System.DateTime.Now;
string strMD = currentTime.ToString("s");
TextBox1.Text = strMD;
怎么TextBox1怎么没有变化的?
<%@ Import Namespace = "System.Timers"%>
<%@ Import Namespace = "System.IO"%>
void Application_Start(object sender, EventArgs e)
{
//Test
Timer t = new Timer(5000);
t.Enabled = true;
t.Elapsed += new ElapsedEventHandler(test);
}
void test(object sender, EventArgs e)
{
string strFileName = @"D:\abc.txt";
StreamWriter sr = File.CreateText(strFileName);
sr.WriteLine(DateTime.Now.ToString());
sr.Close();
return;
}
5秒写一次,这样就可以定时在服务器上进行一些操作了
Timer myTimer = new Timer(5000);//以毫秒为单位
myTimer.AutoReset = true;
myTimer.Enabled = true;
myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
//CreateTxtFile();
}
private void OnTimedEvent(object src,ElapsedEventArgs e){
Application.Lock() ;
Application["aa"] = DateTime.Now.ToString() ;
Application.UnLock();
CreateTxtFile();
}
void CreateTxtFile(){
string strFileName = @"D:\abc.txt";
StreamWriter sr = File.CreateText(strFileName);
sr.WriteLine(DateTime.Now.ToString());
sr.Close();
return;
}
不能对文件操作
谢谢!
我就实现了吗
请教各位高手了
void Session_OnStart(){
Timer myTimer = new Timer(5000);//以毫秒为单位
myTimer.AutoReset = true;
myTimer.Enabled = true;
myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
//CreateTxtFile();
}
private void OnTimedEvent(object src,ElapsedEventArgs e){
Application.Lock() ;
Application["aa"] = DateTime.Now.ToString() ;
Application.UnLock();
CreateTxtFile();
}
void CreateTxtFile(){
string strFileName = @"D:\abc.txt";
StreamWriter sr = File.CreateText(strFileName);
sr.WriteLine(DateTime.Now.ToString());
sr.Close();
return;
}
结果发现,应用程序变量的值确实每隔5000毫秒改变一次,但是CreateTxtFile()方法的调用没有成功,这个方法在ASPX页中测试是可成功执行的.
请大侠们救命!!!我怀疑ASP.net本身是不可以这样做的,如果可以这样,同志们不是可以定时地向别人发许多垃圾东西吗??
1,application我记得应该是从第一个用户开始访问该服务开始才启动,这样的话如果服务器启动后一直没有人访问,是不是application里的东西也无法运行吧?
2。如果是在一个访问量不大的Web应用上,会不会出现application启动后而因为没有访问而自动终止?
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock() 这个之后加了一个插入数据库的操作添加一条记录,可是在运行的时候,这些语句没有执行,这个是为什么。我想实现系统经过一个固定时间就想数据库添加以些记录,这个应该怎么做?
计时器对于 ASP.NET 程序来说,仅在 Web 应用程序级别的代码中有效。
对于初学者来说,就是: Timer 的启动代码必须写在 Global.asax.cs/Global.asax.vb 里面。
前面已经多次强调过:写在 Web Form (*.aspx.cs/*.aspx.vb)中是不起作用的。
现在我有个问题,当把
Sub Fresher(sender As Object, e As ElapsedEventArgs)
Application.Lock()
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock()
End Sub
这端代码中的
Application.Lock()
Application("TimeStamp") = DateTime.Now.ToString()
Application.UnLock()
这个事件放在其它的类中时,这个事件不会被触发,楼主试一下看有这种现象没?比如
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
test t = new test();
t.ADD();
}
public class test
{
public void ADD()
{
System.Web.HttpContext.Current.Application["TimeStamp"] = (int)System.Web.HttpContext.Current.Application["TimeStamp"] + 1;
}
}
计时器没必要是连续运行啊!只要web应用程序运行时,它可以定时触发就足够了。
就像 Windows Forms 程序中的计时器,这一次运行和下一次运行,计时器肯定是不同的。
而至于文中的例子,那只是为了证明,计时器管用,
实际程序中有用吗?
我觉得这种方案应当不是很合理,我提出点疑问,没有经过验证,楼主可以测试一下
因为在所有的会话结束后,Application也会结束,应用程序结束时,定时器应当也会被销毁.
本测试页之所以看起来好象是对的,是因为在Application运行期间,定时器一直有效,而在Application停止后再次启动时,时钟又会再次启动,而你的测试要素是DateTime.Now,看起来好象是最新的,一直在运行一样.实际上可能已不是连续运行的那个定时器了.
楼主可以把测试数据改为
Application.Lock()
Application["Counter"] = 0;
Application.UnLock()
Application.Lock()
Application["Counter"] = Convert.ToInt32(Application["Counter"]) + 1;
Application.UnLock()
这样可以通过数据的大小看是否是连续运行的
服务器向客户端推数据,和Timer无关,常用XMLHTTP之类的技术保持一个socket连接,才能实现推送。
但你所说的定时发送邮件,和“服务器向客户端推送数据”也是无关的,发送信件不需要客户端的参与,只是服务器端单方面的动作,使用本文中所说的Timer是可以做到的。
希望不要混淆了概念。好运!
定时的扫描数据库,并从服务器端将扫描结果发送一封邮件给客户端,提醒客户端.要求用B/S结构做.
当时,我以为用B/S结构从服务器端向客户端推数据根本是做不到的.
现在发现Asp.net可以在服务器端使用Timer,实际上就是提供了一种服务器端向客户端(这里是Browser端)推送数据的手段.
我正再写个网站,里面有个这样的页面(当然,还没有实现)
有8张图片分别装在8个IMAGE里,排列是这样的***
* *
***
我现在的构思是,先随机找到一个图片把它更换成另外的图片,然后按照顺时针方向逐一进行更换,当后一副图片更换,前一副图片就恢复原来的样子,每两张图片之间的时间间隔是0.2秒,用BUTTON启动,让这个过程在3-5秒的随机时间里终止,并显示最后一张图片,
现在请教各位大虾,这个过程用什么方法实现,效率比较高,
高手请回复!!!谢谢!!!
4/20/2005 3:04 AM | 天涯明月无酒
# re: .NET 中的三个 Timer 以及网页中的“Timer”
晕,排列是这样的***
* *
***
如果有其他的方法实现这个效果也可以的!谢谢!!!
4/20/2005 3:06 AM | 天涯明月无酒
# re: .NET 中的三个 Timer 以及网页中的“Timer”
倒,你这个网站看来有点BUG,
排列是这样的 ***
--------------- * *
--------------- ***
现在总该不会错吧@-@
4/20/2005 3:08 AM | 天涯明月无酒
作用大大
有谁能告诉我为什么要刷新网页?对网站有什么好处吗?我指的是在网站宣传方面?
谢谢!
哈哈,受益匪浅阿,谢谢楼主了。
允许我转载一下吧:)
就常用的 ASP 组件来说,还没有办法实现。
我很久不用 ASP 了,不知道是否有第三方组件可以实现这样的功能。
因为计时器代码是在整个应用程序中运行的,本身没有界面,例子中 test.aspx 的目的是为了显示当前 Application("TimeStamp") 的值来验证 计时器代码是否真正起作用了。
只有计时器代码起作用,Application("TimeStamp") 的值才会每隔 5秒自动改变。刷新 test.aspx 就是要看看它是不是每隔 5秒自动改变了这个值。
而 test.aspx 本身对计时器并没有什么作用。
谢谢
我决定用这个定时给一些不经常更新的博客发垃圾邮件了。:D
闹到你们每天必须更新二十四篇,否则,大刑伺候。