我应该在哪里放置一个每5分钟调用一次方法的计时器

时间:2013-01-25 18:06:45

标签: asp.net

我应该在哪里放置一个每5分钟调用一次方法的计时器?

我把它放在MasterPage中,但每次加载使用此MasterPage的页面时都会调用,但我想每5分钟调用一次

我在MasterPage中使用此代码

<body>
    <form id="form1" runat="server">
            <div id="divNews" class="news" runat="server"></div>

            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <asp:UpdatePanel runat="server" id="UpdatePanel" updatemode="Conditional">
                <ContentTemplate>
                    <div class="divTit">
                        <table style=" width:100%">
                            <tr style=" width:100%; text-align:right;">
                                <td style=" width:100%;"><!--Inbox-->
                                    <asp:LinkButton CssClass="lblMainMenu1" runat="server" ID="lblInbox" OnClick="inbox_Click"></asp:LinkButton>
                                    <asp:Label Text="Inbox :" runat="server" CssClass="lblMainMenu2"></asp:Label>
                                </td>
                            </tr>
                        </table>
                    </div>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger controlid="timer" EventName="Tick" />
                </Triggers>
            </asp:UpdatePanel>

            <asp:Timer Interval="1" ID="timer" OnTick="timer_Tick" runat="server"></asp:Timer>

        <div id="body" class="divBody">
            <asp:ContentPlaceHolder id="head" runat="server"></asp:ContentPlaceHolder>
            <asp:ContentPlaceHolder id="contentMain" runat="server"></asp:ContentPlaceHolder>
        </div>

    </form>
</body>

1 个答案:

答案 0 :(得分:0)

我不会在页面内执行此操作。正如您所见,您无法以这种方式可靠地创建长时间运行的计划任务。

实现这一目标的最佳方式实际上取决于您想要做的事情。

如果您希望每五分钟更新浏览器中的页面,则可以在JavaScript中设置计时器并执行AJAX请求以检索更新的内容。或者 - 更简单但更不干净 - 您可以使用HTTP-equiv meta attribute每五分钟刷新整个页面。但是,正如链接所述,这会破坏一些可访问性规则。此外,如果您有一个用户正在填写的表单,那么当页面刷新时,他们输入的任何信息都将丢失。

如果您尝试触发一些非特定于用户的服务器端任务,您可以使用以下几种不同的路径:

  1. 创建一个在服务器上运行的Windows服务(可能是您的Web服务器,但它可以在任何地方)。您可以直接在服务中每隔五分钟放置一次所需的代码,或使用WebClient之类的内容从您的网站请求页面,然后执行您需要的任何任务。

  2. 创建一个控制台应用程序,PowerShell脚本等,它使用WebClient检索页面,并将其添加到Windows task scheduler以使其每隔几分钟运行一次。这样做的好处是不需要你创建服务,如果这是你不熟悉或不熟悉的事情。

  3. 使用wget for Windows之类的实用程序,而不是编写脚本或控制台应用程序。使用上面提到的任务调度程序每隔几分钟运行一次,将所需的URL指定为命令行参数。这可能是最简单的,但放弃了其他两个选项提供的一些灵活性。

  4. **更新** 如果您只是想要定期更新页面中的某些内容(如检查消息等),则a very simple tutorial that doesn't require you to create any JavaScript here

    出于存档完整性的目的,这里是代码:

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Update Panel and Timer</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <asp:Timer runat="server" id="UpdateTimer" interval="5000"
              ontick="UpdateTimer_Tick" />
            <asp:UpdatePanel runat="server" id="TimedPanel" updatemode="Conditional">
                <Triggers>
                    <asp:AsyncPostBackTrigger controlid="UpdateTimer"
                      eventname="Tick" />
                </Triggers>
                <ContentTemplate>
                    <asp:Label runat="server" id="lbldatetime" />
                </ContentTemplate>
            </asp:UpdatePanel>
        </form>
    </body>
    </html>
    

    在代码隐藏中:

    protected void UpdateTimer_Tick(object sender, EventArgs e)
    {  
    lbldatetime.Text = DateTime.Now.ToString();
    }