Timer定时器过段时间后自动停止运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Timer定时器过段时间后自动停止运行相关的知识,希望对你有一定的参考价值。

我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位!
我是在.net framework中的,有一个Global.asax全局应用程序文件,帖代码:
public class Global : System.Web.HttpApplication

double iTimerInterval;
System.Timers.Timer timer = new System.Timers.Timer();
SmsRun smsRun = new SmsRun();
object objLock = new object();
protected void Application_Start(object sender, EventArgs e)

//在应用程序启动时运行的代码
//在新会话启动时运行的代码
SetAccount();
timer.Start();//定时器开始


protected void Application_End(object sender, EventArgs e)

timer.Stop();


private void SetAccount()

double.TryParse(ConfigurationManager.AppSettings["TimerInterval"], out iTimerInterval);
timer.Interval = iTimerInterval;
timer.Elapsed += new System.Timers.ElapsedEventHandler(getMessage);
//getMessage是个方法(略)

有可能是由于timer已经被回收掉了 你是在什么环境下面winform? webform?

经过你的补充我看明白了 是这样的 由于你的应用程序在特定空闲时间之后相应的w3wp辅助进程会被回收掉 所以你的timer自然没有作用了 你可以查看iis 应用程序池的属性 切换到性能选项卡空闲超时 默认的时间是20分钟 也就是说如果20分钟内你的网站没有任何请求那么就会造成回收
参考技术A 很简单,session过期了。
连接被中断了。

webform中Global中使用定时器

2019-08-23
这个方法未经上线测试,记得以前测试时这个定时器在运行一段时间后就会停止,原因是IIS应用程序池的回收机制,IIS应用程序运行一段时间后如果没有数据的交互IIS会将资源回收,也就导致定时器停止运行。
 
1、不建议使用Timer,单独的使用Timer 效果是不理想的,
Timer 使用前提是 必须在时间段内有人访问或请求网站才行,如果长时间没人访问网站或者超出定时时间段就不起作用(因为IIS的线程回收机制)。
好的方式是采用线程的方式。
sleep(time)的方式!!
当程序发布后,只要你第一次访问页面,激活线程,然后Thread.Sleep(time) 定时就可以了,当然截止到你iis重启或停止。
 
2、实例
 
Thread TempHumiRecordTh;
int TimeTempHumiRecord = 30;
 
private void ThreadTempHumiRecord()
{
try
{
TimeTempHumiRecord = int.Parse(Utility.GetAppSetting("Access_GetTempHumiRecord")); //如果时间小于=0 则不跑
if (TimeTempHumiRecord > 0)
{
TempHumiRecordTh = new Thread(GetTempHumiRecord);
TempHumiRecordTh.IsBackground = true;//设为 后台线程
TempHumiRecordTh.Start();
}
}
catch
{
}
}
private void GetTempHumiRecord()
{
try
{
//要循环执行的逻辑过程
while (true)
{
Utility.GetTempHumiRecordDataByAccess();
 
Thread.Sleep(1000 * TimeTempHumiRecord);//根据指定时间刷新(单位:毫秒)
}
}
catch (Exception ex)
{
if (!ex.Message.Equals("正在中止线程。"))
{
if (TempHumiRecordTh != null)
{
try
{
TempHumiRecordTh.Abort();
}
catch { }
}
}
}
}

以上是关于Timer定时器过段时间后自动停止运行的主要内容,如果未能解决你的问题,请参考以下文章

如何停止 System.Threading.Timer,然后更改其参数并再次运行? [复制]

[GO]定时器的停止

C# winform中timer函数如何停止,点运行后可再次启动周期事件

C# winform中timer函数如何停止,点运行后可再次启动周期事件

Java基础系列6:计时器Timer与新闻的定时自动采集

jbpm timer实现自动提醒审批功能