分析在服务器上设置计时器的问题。
2006-01-16 10:05
639 查看
分析在服务器上设置计时器的问题。
前些时候,在博客堂上看到有一篇关于在服务器上设定计时器,让服务器定时工作的文章,当时觉得很不错,而且为我们在服务器的后台上做一些费时的事情提供了好的解决方案。然而,这只是一个实践式的说明,没有更深入的分析用了计时器之后的一些资源、安全等实际的问题。在采用计时器之前,先看看计时器是怎样工作的,这里有一个例子(注意计时器的线程ID号):
unsafe public static void Main()
private static void TmierTest()
private static void m_timer_Elapsed(object sender, ElapsedEventArgs e)
//Class name :Sample
private static Sample m_object;
unsafe public static void Main()
public void WriteLine(string i_msg)
private static void TmierTest()
private static void m_timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Thread:"+DateTime.Now.ToString()+",Thread ID:"+AppDomain.GetCurrentThreadId().ToString()+",M_count:"+(m_count++).ToString());
m_object.WriteLine(AppDomain.GetCurrentThreadId().ToString());
Thread.Sleep(1000);
}运行结果:
请注意在TimerTest函数里注释掉的一句:m_object=null;
如果不注释这一句,后果是什么?让我很吃惊,什么事都没有!而且程序可以正常运行,只不过没有Test output的输出,这说明资源是无效的,但程序却不出任何问题,也就是说计时器一样的工作。可以想像,这样的工作已经是无效的了,然后却得不到任何的错误反馈(只在m_object=null的时候有一点点的停顿,调试也没有给出错误)。只有通过try-catch-结构可以得到错误信息,进而进行一些处理。然而这样的问题也是很严重的。
现在应该可以很清楚的认识到,如果在服务器上添加计时器其后果是什么了。
这里给出一个类的说明:
Httpcontent.Current.Request;
帮助上说的很清楚,它只能在ASP.net应该程序里使用,而且不能被继承。
如果在全局上(Global)上使用它,那么你是可以很轻松的使用它从而取得当前用户的请求,从而进行一些事件处理。
然而,如果当前用户的请求已经停止,或者用户的Session已经终止,那么计时器里的所有处理都将是无对对象的,而这样的错误几乎没有什么现象发生,因为你不可能把所有的工作都用try-catch来处理,就算是这样,也不清楚什么时候会出现这样的错误,而且出现错误后,除了清理计时器及一些资源清理外,几乎不能做其它的事情了。经过本人的多次测试(好几个星期使用服务器计时器),最后还是觉得它太不稳定了,出错机率极高,而且从错误的日志里发现它的很多错误是莫名其妙的。
最为严重的还是它的错误会严重影响IIS的正常工作,也就是说一但计时器错误,IIS的访问也会出现错误(在有资源共享的时候,如数据库的链接,这几乎是绝对的)。
经过这几个星期的测试及分析,还是觉得在服务器上使用计时器真的是一件很不划算的事情,虽然理论上可行,而且在短时间内它的处理还是不错的,但长期的效果真的很差,而且对整个应用程序的影响也是很严重的。更不用说把计时器封装在类里,这样的做法几乎是灾难性的(我就是这样做的)。
给一点错误的日志:
1/5/2006 11:02:31 PM Error in SeverForDeleteedFiles: Unspecified error
1/5/2006 11:07:52 PM Stop the WaveSystemService.
1/5/2006 11:07:52 PM System.EventArgs
1/6/2006 12:42:07 AM System.EventArgs
1/6/2006 12:47:53 AM Unspecified error
1/6/2006 12:48:06 AM Unspecified error
1/6/2006 10:01:33 AM System.EventArgs
1/6/2006 10:01:38 AM System.EventArgs
1/6/2006 10:18:53 AM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 10:35:33 AM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 10:52:13 AM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 11:08:53 AM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 11:20:26 AM System.EventArgs
1/6/2006 4:31:59 PM Do file clean up for client: 21
1/6/2006 4:48:39 PM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 5:17:09 PM System.EventArgs
1/6/2006 5:24:20 PM Stop the WaveSystemService.
简单的说明一下,在无奈之下,我也是在整个函数里使用了catch结构才得到这么一点Unspecified error信息。而与此同时,IIS的请求也会有同样的错误产生。总之,服务器上是不能用计时器了的,至少我是不敢用了。
前些时候,在博客堂上看到有一篇关于在服务器上设定计时器,让服务器定时工作的文章,当时觉得很不错,而且为我们在服务器的后台上做一些费时的事情提供了好的解决方案。然而,这只是一个实践式的说明,没有更深入的分析用了计时器之后的一些资源、安全等实际的问题。在采用计时器之前,先看看计时器是怎样工作的,这里有一个例子(注意计时器的线程ID号):
unsafe public static void Main()
private static void TmierTest()
private static void m_timer_Elapsed(object sender, ElapsedEventArgs e)
//Class name :Sample
private static Sample m_object;
unsafe public static void Main()
public void WriteLine(string i_msg)
private static void TmierTest()
private static void m_timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Thread:"+DateTime.Now.ToString()+",Thread ID:"+AppDomain.GetCurrentThreadId().ToString()+",M_count:"+(m_count++).ToString());
m_object.WriteLine(AppDomain.GetCurrentThreadId().ToString());
Thread.Sleep(1000);
}运行结果:
请注意在TimerTest函数里注释掉的一句:m_object=null;
如果不注释这一句,后果是什么?让我很吃惊,什么事都没有!而且程序可以正常运行,只不过没有Test output的输出,这说明资源是无效的,但程序却不出任何问题,也就是说计时器一样的工作。可以想像,这样的工作已经是无效的了,然后却得不到任何的错误反馈(只在m_object=null的时候有一点点的停顿,调试也没有给出错误)。只有通过try-catch-结构可以得到错误信息,进而进行一些处理。然而这样的问题也是很严重的。
现在应该可以很清楚的认识到,如果在服务器上添加计时器其后果是什么了。
这里给出一个类的说明:
Httpcontent.Current.Request;
帮助上说的很清楚,它只能在ASP.net应该程序里使用,而且不能被继承。
如果在全局上(Global)上使用它,那么你是可以很轻松的使用它从而取得当前用户的请求,从而进行一些事件处理。
然而,如果当前用户的请求已经停止,或者用户的Session已经终止,那么计时器里的所有处理都将是无对对象的,而这样的错误几乎没有什么现象发生,因为你不可能把所有的工作都用try-catch来处理,就算是这样,也不清楚什么时候会出现这样的错误,而且出现错误后,除了清理计时器及一些资源清理外,几乎不能做其它的事情了。经过本人的多次测试(好几个星期使用服务器计时器),最后还是觉得它太不稳定了,出错机率极高,而且从错误的日志里发现它的很多错误是莫名其妙的。
最为严重的还是它的错误会严重影响IIS的正常工作,也就是说一但计时器错误,IIS的访问也会出现错误(在有资源共享的时候,如数据库的链接,这几乎是绝对的)。
经过这几个星期的测试及分析,还是觉得在服务器上使用计时器真的是一件很不划算的事情,虽然理论上可行,而且在短时间内它的处理还是不错的,但长期的效果真的很差,而且对整个应用程序的影响也是很严重的。更不用说把计时器封装在类里,这样的做法几乎是灾难性的(我就是这样做的)。
给一点错误的日志:
1/5/2006 11:02:31 PM Error in SeverForDeleteedFiles: Unspecified error
1/5/2006 11:07:52 PM Stop the WaveSystemService.
1/5/2006 11:07:52 PM System.EventArgs
1/6/2006 12:42:07 AM System.EventArgs
1/6/2006 12:47:53 AM Unspecified error
1/6/2006 12:48:06 AM Unspecified error
1/6/2006 10:01:33 AM System.EventArgs
1/6/2006 10:01:38 AM System.EventArgs
1/6/2006 10:18:53 AM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 10:35:33 AM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 10:52:13 AM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 11:08:53 AM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 11:20:26 AM System.EventArgs
1/6/2006 4:31:59 PM Do file clean up for client: 21
1/6/2006 4:48:39 PM Error in SeverForDeleteedFiles: Unspecified error
1/6/2006 5:17:09 PM System.EventArgs
1/6/2006 5:24:20 PM Stop the WaveSystemService.
简单的说明一下,在无奈之下,我也是在整个函数里使用了catch结构才得到这么一点Unspecified error信息。而与此同时,IIS的请求也会有同样的错误产生。总之,服务器上是不能用计时器了的,至少我是不敢用了。
相关文章推荐
- [原创]分析解决lvs fullnat模式下后端服务器获取真实IP地址异常问题
- 第五章:iptables应用案例分析(包过滤服务器上设置iptables)
- SQL Server2008 备份“已注册的服务器”设置,以及出现导入失败问题的解决办法
- 动态生成的IFRAME,设置SRC时的问题解决分析
- 在WIN8系统上用户phpMailer 连接不上smtp 服务器的问题分析
- 页面提交后提示“连接被重置”或“载入页面时到服务器的连接被重置”的问题分析
- 关于设置捕获信号的gen_server在-eval无法正常启动问题分析
- 服务器架构设计,常见问题分析
- 服务器架构设计,常见问题分析
- 关于win2003+iis服务器故障处理和设置问题
- 对服务器上出现大量的SYN_RECV状态的TCP连接的问题分析
- Google Analytics(分析)设置步骤及常见问题
- 如何处理服务器重启后,日志分析的重新挂载的问题
- iis6应用程序池被自动禁用问题 Service Unavailable 应用程序池 'DefaultAppPool' 被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。应用程序-特定 权限设置未将 COM 服务器应用程序(CLSID 为
- IBM Websphere培训4——连接池设置和Web服务器问题诊断
- 服务器向手机设置代码分析
- SQL Server2008 备份“已注册的服务器”设置,以及出现导入失败问题的解决办法
- Qt中用同一个变量的QString::setNum()来设置数字存在的不确定性问题分析
- 数据库字段设置问题,具体问题具体分析
- IIS服务器设置造成引用第三方权限不足问题