从global.asax调用aspx.cs页面中的函数

时间:2013-05-01 13:37:03

标签: c# asp.net

我有代码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)。

知道怎么调用这个函数吗?

3 个答案:

答案 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)

我将代码转换为非可视类并调用它。

如果您需要它是可视的,请将其设置为可视用户控件并将其包含在您使用的母版页中。

我同意,当不是页面运行时,尝试在不同的页面上调用某些内容只是在寻找问题。