0

我得到代码 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)中的函数。

知道如何调用这个函数吗?

4

3 回答 3

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()不能依赖页面中特定的任何实例。

我会重新考虑你的方法。

另请注意,恕我直言,计时器在这里是个坏主意,如果应用程序进程卸载您的计时器将永远不会被调用,因此您不能真正依赖它们。

于 2013-05-01T13:44:22.090 回答
2

如果您需要从外部调用 PAGE 方法,那么您的设计非常糟糕。在做任何其他事情之前,我建议您对将代码分成多个层进行一些研究,这样这种情况就永远不会发生。

但是,如果您仍然坚持要按照自己的方式进行操作(无论如何您迟早会明白),最简单的解决方案是使请求的页面方法静态化。这样您就可以随时调用它而无需引用实际实例。

于 2013-05-01T13:44:11.237 回答
0

我会将代码制作成非可视类并调用它。

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

我同意当页面不在运行时尝试在不同的页面上调用某些东西只是在问问题。

于 2013-05-01T14:48:11.633 回答