【发布时间】:2019-08-30 15:42:16
【问题描述】:
我创建了一个带有按钮的 ASP.NET Web 表单(页面?)在一张桌子上。单击事件按钮中的代码也应该刷新网页以显示更新的数据。当用户物理单击按钮时,这在大多数情况下都有效。但是,当我创建一个计时器对象来运行一个调用单击事件的方法时,我收到一个错误:System.NullReferenceException:'对象引用未设置为对象的实例。 System.Web.HttpContext.Current.get 返回 null。什么给了?
就像我说的,当有物理用户单击按钮时它可以工作,但最终我想自动打开 Access db 的任务,以及用新数据刷新 Web 表单(页面?)。
这是按钮点击代码。注释行是我已经尝试过的:
protected void btnRefresh_Click(object sender, EventArgs e)
{
Process.Start(@"C:\Users\mperea\Desktop\DC8SortMonitor.accdb");
HttpContext.Current.Response.Redirect("~/Default.aspx");
//Response.Redirect("~/Default.aspx");
//Page.Response.Redirect(Page.Request.Url.ToString(), true);
//Server.TransferRequest(Request.Url.AbsolutePath, false);
//Trying open access with this didn't work:
//Access.Application oAccess = new Access.ApplicationClass();//oAccess.OpenCurrentDatabase(@"C:\Users\mperea\Desktop\DC8SortMonitor.accdb");
}
这是一个计时器对象,旨在以编程方式执行调用点击事件的方法:
protected void Page_Load(object sender, EventArgs e)
{
Timer aTimer;
//Create a timer and set a two second interval.
aTimer = new System.Timers.Timer();
aTimer.Interval = 15000;
//ElapsedEventHandler btnRefresh_Click = null;
//Hook up the Elapsed event for the timer.
aTimer.Elapsed += timer;
//Have the timer fire repeated events(true is the default)
aTimer.AutoReset = true;
//Start the timer
aTimer.Enabled = true;
}
以及定时器调用的方法:
public void timer(object sender, EventArgs e)
{
btnRefresh_Click(null, null);
}
【问题讨论】:
-
在你走这条路之前,如果你想在服务器端发生定时事件,你不应该使用前端来创建它们。使用适当的服务端组件(即 Windows 服务),或者如果必须,使用 Hangfire 等工具。
-
对于常用方法,我一般都是创建一个非事件方法,然后从事件中调用代码
-
谢谢,大卫!您能否提供有关此特定方法为何不起作用的任何见解?我不一定要让它发生在服务器端。如果它可以在客户端工作,那就这样吧,但是如何?
-
不管具体错误如何,通过这种方法它永远不会正常工作,因为当 http 请求结束并且响应返回给浏览器时,您的 c# 代码将停止运行。它不会等待计时器运行。这就是 Web 应用程序的工作方式:它们是无状态的,它们在请求进入时启动、执行、返回响应并再次停止,直到下一个请求。这就是为什么如果您想要在常规计时器上长时间运行的作业,您需要后台服务
-
@ADyson 非常感谢!非常感谢您的 cmets。我对开发还很陌生,每一个小消息都有很大的帮助。 :)
标签: c# asp.net ms-access visual-studio-2019