我有代码inglobal.asax页面:
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
System.Timers.Timer timScheduledTask = new System.Timers.Timer();
// Timer interval is set in miliseconds,
// In this case, we'll run a task every minute
timScheduledTask.Interval = 60 * 1000;
timScheduledTask.Enabled = true;
// Add handler for Elapsed event
timScheduledTask.Elapsed += new System.Timers.ElapsedEventHandler(timScheduledTask_Elapsed);
}
void timScheduledTask_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// Over here i want to call function that i have in asp.net page
}
我的问题是在timScheduledTask_Elapsed
函数中,我想调用我在asp.net页面中的函数(Contacts.aspx.cs)。
知道怎么调用这个函数吗?
答案 0 :(得分:4)
它需要是页面的静态方法,因为应用程序类无法知道当前页面实例。
下面可以看到一个粗略的例子。
somepage.aspx:
public class SomePage : Page
{
public static void DoSomething()
{
...
}
}
global.asax:
void Application_Start(object sender, EventArgs e)
{
...
// Add handler for Elapsed event
timScheduledTask.Elapsed += new System.Timers.ElapsedEventHandler(timScheduledTask_Elapsed);
}
void timScheduledTask_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
SomePage.DoSomething();
}
但是,这确实意味着DoSomething()
中的任何内容都不得依赖于页面中特定的任何实例。
我会重新考虑你的方法。
另请注意,定时器在这里是一个坏主意恕我直言,如果应用程序进程卸载你的定时器永远不会被调用,所以你不能真正依赖它们。
答案 1 :(得分:2)
如果你需要从外面调用PAGE方法,那么你的设计非常糟糕。在做任何其他事情之前,我建议你做一些将代码分成多层的研究,这样的情况可以从不发生。
如果您仍然坚持要按照自己的方式进行操作(无论何时迟早都会理解),最简单的解决方案是使请求的页面方法保持静态。这样,您可以随时调用它而无需引用实际实例。
答案 2 :(得分:0)
我将代码转换为非可视类并调用它。
如果您需要它是可视的,请将其设置为可视用户控件并将其包含在您使用的母版页中。
我同意,当不是页面运行时,尝试在不同的页面上调用某些内容只是在寻找问题。