各位大大,请帮帮忙看看我的这段Global.asax里的代码为什么不能执行

zhumaocai 2010-01-09 02:52:47
如题,先谢过各位了,刚接触,想在Global.asax做个定时检查的功能,但结果是没反映(里面执行的那段代码是测试的,就是往数据库里增加一个记录),代码如下:

<%@ Application Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Timers" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Threading" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Configuration" %>
<%@ Import Namespace="System.Web" %>

<script runat="server">
private System.Timers.Timer myTimer;
protected void Application_Start(Object sender, EventArgs e)
{
//定义定时器
myTimer=new System.Timers.Timer(60000);
myTimer.Elapsed+=new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
myTimer.Enabled=true;
myTimer.AutoReset = true;

}

private void myTimer_Elapsed(object source, ElapsedEventArgs e)
{
//这里写需要执行的任务
string TestSMS="test";
string connstr="Provider=Microsoft.Jet.Oledb.4.0;Data Source="+ Server.MapPath(ConfigurationSettings.AppSettings["DBPath"])+";";
OleDbConnection conn=new OleDbConnection(connstr);
conn.Open();
string sql = String.Format("insert into smscheck(TestSMS) values(@TestSMS)");
OleDbCommand updatecomm=new OleDbCommand(sql,conn);
updatecomm.Parameters.AddWithValue("@TestSMS",TestSMS);
updatecomm.ExecuteNonQuery();
updatecomm.Dispose();
conn.Close();
conn.Dispose();
}


protected void Application_End(Object sender, EventArgs e)
{
//下面的代码解决IIS应用程序池自动回收的问题
Thread.Sleep(1000);
//这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
string url = "http://localhost:82/111.aspx";
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流

}
</script>
...全文
467 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhumaocai 2010-01-17
  • 打赏
  • 举报
回复
jshi123真是厉害,按你说的第一种方法达到目的了,第二种以~/开头的绝对路径的不知哪里错了没搞好,非常感谢,我是自学的,刚接触,你能介绍点资料或书我看看吗?很多东西糊里糊涂的。
jshi123 2010-01-17
  • 打赏
  • 举报
回复
第二种方法是指web.config中的DBPath这个路径要以~/开头,你检查下web.config文件吧

我不擅长给人介绍资料,唯一我能说的就是多看、多练,找资料的话,你可以另外问下csdn上的高手吧
zhumaocai 2010-01-16
  • 打赏
  • 举报
回复
jshi123有来看过吗?帮帮忙啊,谢谢了
jshi123 2010-01-16
  • 打赏
  • 举报
回复
或者你也可以把Server.MapPath替换成 HostingEnvironment.MapPath
注意,如果用这种方法,你的DBPath里必须写绝对路径,就是说必须用毛毛虫开头的"~/xxx/xxx.mdb"这种形式
jshi123 2010-01-16
  • 打赏
  • 举报
回复
定义一个类成员变量connstr:
private string connstr;

在Application_Start中对其赋值:
connstr = "Provider=Microsoft.Jet.Oledb.4.0;Data Source="+ Server.MapPath(ConfigurationSettings.AppSettings["DBPath"])+";";

在 myTimer_Elapsed中直接使用它就可以了
zhumaocai 2010-01-14
  • 打赏
  • 举报
回复
谢谢楼上的老大,我觉得你说的很有可能,但我不知道具体要怎么做,能给点具体的代码吗?
zhumaocai 2010-01-14
  • 打赏
  • 举报
回复
jshi123果然厉害,确实是路径的问题,但我是刚学的,试着用HostingEnvironment,但没成功,jshi123大侠能不能把你说的这二种方法的具体实现代码写出来让我照搬再研究一下呢?
就是:“把数据库的连接串在Application_Start中拼接好以后通过参数传递给定时器事件,或者把Server.MapPath改成HostingEnvironment.MapPath”

不胜感激啊!
jshi123 2010-01-14
  • 打赏
  • 举报
回复
在定时器事件中Server.MapPath不可用,因事件在后台工作线程中执行,而Server.MapPath需要用到Page.Request对象
把数据库的连接串在Application_Start中拼接好以后通过参数传递给定时器事件,或者把Server.MapPath改成HostingEnvironment.MapPath
jshi123 2010-01-14
  • 打赏
  • 举报
回复
那你先做下测试确定是否这个原因吧,先把连接串手工硬编码写死在程序里,再运行看看
wapit 2010-01-13
  • 打赏
  • 举报
回复
用BackgroundWorker+Thread.Sleep(60000)吧, 我的这样可以的......
zhumaocai 2010-01-13
  • 打赏
  • 举报
回复
谢谢楼上的,现在问题是Application_Start里的TIMER不生效,怎么办?就是把“定义定时器”的代码和“执行数据库插入”的代码放到其它普通页面里都没问题,为什么这里就行了了?
gdlpc 2010-01-13
  • 打赏
  • 举报
回复
要在Web.Config的<system.web>...</system.web>中设置:sessionState mode="InProc"
例如:
<sessionState mode="InProc" timeout="15" cookieless="false"/>
<!--上句是用户加上的-->

Application_End才能有效。
newdigitime 2010-01-12
  • 打赏
  • 举报
回复
建议换用
System.Threading.Timer 试试.查了一下,据说System.Timers.Timer不太好用.
zhumaocai 2010-01-12
  • 打赏
  • 举报
回复
谢谢楼上的SP1234,但按你的方法加了START和STOP也是不行,同样是不执行插入数据库记录
zhumaocai 2010-01-09
  • 打赏
  • 举报
回复
应该不是数据库的问题,我把代码放在另一个页面上,用页面装载时去启动它,能实现效果,代码就是:

void Page_load(Object obj,EventArgs e)
{
//定义定时器
myTimer=new System.Timers.Timer(60000);
myTimer.Elapsed+=new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
myTimer.Enabled=true;
myTimer.AutoReset = true;

}

private void myTimer_Elapsed(object source, ElapsedEventArgs e)
{
//这里写需要执行的任务
string TestSMS="test";
string connstr="Provider=Microsoft.Jet.Oledb.4.0;Data Source="+ Server.MapPath(ConfigurationSettings.AppSettings["DBPath"])+";";
OleDbConnection conn=new OleDbConnection(connstr);
conn.Open();
string sql = String.Format("insert into smscheck(TestSMS) values(@TestSMS)");
OleDbCommand updatecomm=new OleDbCommand(sql,conn);
updatecomm.Parameters.AddWithValue("@TestSMS",TestSMS);
updatecomm.ExecuteNonQuery();
updatecomm.Dispose();
conn.Close();
conn.Dispose();
}

这样就没问题,到底原因出在什么地方?

还有,楼上的,Global.asax中的Application_Start不是只会运行一次的吗?怎么会重复实例呢?不明白
mngzilin 2010-01-09
  • 打赏
  • 举报
回复
在等待过程中,页面不要关闭。

同时,在myTimer_Elapsed中下断点,看看有没有进去,如果进去了,就是你数据库操作的问题了。

加判断只是为了判断是否重新实例化timer了,可以将timer定义成static的,用if(timer==null)判断
zhumaocai 2010-01-09
  • 打赏
  • 举报
回复
谢谢楼上的热心人,没想到这么晚还有人回复啊,本打算睡前试试看有没人回的,谢了啊。

你说的等一分钟会执行,我试过反复等很久也没执行插入记录的数据库操作结果。

而你说“Application_Start是第一次访问时候执行”,我试过重启机器,结果还是不执行要执行语句;

第三个,你所说的要加判断,怎么判断?谢谢
mngzilin 2010-01-09
  • 打赏
  • 举报
回复
myTimer=new System.Timers.Timer(60000);
你这里时间是60000,就是1分钟,要等1分钟才执行。

Application_Start是第一次访问时候执行,只要没有停止访问该站点,以后重复访问不再执行。

你的Application_Start事件在多用户访问时候myTimer会被反复实例化,最好做判断。
zhumaocai 2010-01-09
  • 打赏
  • 举报
回复
但如果把执行部分的代码放在开始那个位置就能执行一次,如下:
<%@ Application Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Timers" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Threading" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Configuration" %>
<%@ Import Namespace="System.Web" %>

<script runat="server">

protected void Application_Start(Object sender, EventArgs e)
{
//定义定时器
string TestSMS="test";
string connstr="Provider=Microsoft.Jet.Oledb.4.0;Data Source="+ Server.MapPath(ConfigurationSettings.AppSettings["DBPath"])+";";
OleDbConnection conn=new OleDbConnection(connstr);
conn.Open();
string sql = String.Format("insert into smscheck(TestSMS) values(@TestSMS)");
OleDbCommand updatecomm=new OleDbCommand(sql,conn);
updatecomm.Parameters.AddWithValue("@TestSMS",TestSMS);
updatecomm.ExecuteNonQuery();
updatecomm.Dispose();
conn.Close();
conn.Dispose();

}

private void myTimer_Elapsed(object source, ElapsedEventArgs e)
{
//这里写需要执行的任务

}


protected void Application_End(Object sender, EventArgs e)
{
//下面的代码解决IIS应用程序池自动回收的问题
Thread.Sleep(1000);
//这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
string url = "http://localhost:82/111.aspx";
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流

}
</script>
  • 打赏
  • 举报
回复
呵呵,.net中有好几个timer。你选的那个,需要执行它的Start()方法地。

例如:
protected void Application_Start(Object sender, EventArgs e) 
{
//定义定时器
myTimer=new System.Timers.Timer(60000);
.......
myTimer.Start();
}

private void myTimer_Elapsed(object source, ElapsedEventArgs e)
{
myTimer.Stop();
//这里写需要执行的任务
myTimer.Start();
}
加载更多回复(2)

62,046

社区成员

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

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

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

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