繁体   English   中英

在 ASP.NET web 应用程序中,我在哪种方法中实现一个每 5 分钟调用一次 function 的计时器? 没有 main() 可以在 PageLoad 中吗?

[英]In ASP.NET web application, in which method do I implement a timer that calls a function every 5 minutes? There's no main() could it be in PageLoad?

I have an ASP.NET Web application, in the.aspx.cs file, I have to call a function called RefreshData() every 10 minutes that basically updates the Gridview, Gridvew1 using Databind().

在 PageLoad 方法中,我有一些代码应该使用计时器每 5 分钟调用一次 RefreshData() 但它似乎不起作用

aTimer = new System.Timers.Timer();
        aTimer.Interval = 1000 * 300;

        aTimer.Elapsed += OnTimedEvent;

        // Have the timer fire repeated events (true is the default)
        aTimer.AutoReset = true;

        // Start the timer
        aTimer.Enabled = true;


    }

    protected void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
    {
        RefreshData();
        Label3.Text = "The Elapsed event was raised at " + e.SignalTime.ToString();
    }

既然没有 Main() 方法,那么这个定时器在哪里可以实现呢?

谢谢。

作为一般规则,您希望避免在 web 页面中使用计时器类型的东西。

请记住,背后的值和代码仅在短页面回发期间存在。 一旦 web 页面发送到客户端,然后 web 页面、代码中的变量和所有内容都被转储并从 memory 中删除。 web 服务器现在正在等待来自任何用户的任何页面 - 而不仅仅是您的 web 页面,该页面现在已从 scope 中消失。 后面的代码不见了——很像调用 function,返回后,你刚刚调用的 function 现在不见了。 您必须考虑这样的 web 页面。 您可能有 10 个用户 --- 但您只有一个 web 服务器可以处理来自该用户的页面。

那么在您的页面发送到客户端之后? 然后你所有的服务器端代码都消失了——超出范围! - 不存在了!!!

因此,让计时器运行的最简单方法是让 web 页面以您想要的时间间隔回发。 这必须发生在浏览器端级别。 这意味着您卷起袖子并编写 JavaScript,或者您可以使用一些内置工具来做同样的事情(有一个浏览器端计时器控件可以用于此目的)。

因此,您不能在页面后面的代码中包含一些计时器代码,因为该页面不再存在,,? 这页纸。 代码,变量,在页面向下移动到客户端浏览器后,它们都消失了。 在服务器端,您的页面页面代码被转储 - 消失了,不再存在!

这就是为什么我们将 web 称为无状态开发。 scope 运行后的代码和页面退出。 正如我所说,考虑这一点的一个好方法是当您调用 function 并且 function 退出时 - ZC1C425268E68385D1AB5074C17A94F14 调用中的代码和值现在消失了。 这样想你的整个 web 页面 - 一旦回发和往返完成,它就会从 scope 消失。 您没有每个用户的桌面,而是一个必须处理来自任何用户的任何页面的 web 服务器。 每个 web 页面和该代码因此在页面事件和处理完成后不再存在,并且页面被发送回客户端。

所以,假设我们有这个网格:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="ID" CssClass="table table-hover" width="40%">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName"  />
        <asp:BoundField DataField="LastName" HeaderText="LastName"  />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
        <asp:BoundField DataField="City" HeaderText="City"  />
        <asp:BoundField DataField="Description" HeaderText="Description"  />

        <asp:TemplateField HeaderText="" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <button id="cmdDelete" runat="server" class="btn" 
                    onserverclick="cmdDelete_ServerClick" >
                    <span aria-hidden="true" class="glyphicon glyphicon-trash"> Delete</span> 
                </button>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

要加载的代码是这样的:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();
    }

    void LoadGrid()
    {
        string strSQL = @"SELECT * FROM tblHotelsA ORDER BY HotelName";
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                conn.Open();
                DataTable rstData = new DataTable();
                rstData.Load(cmdSQL.ExecuteReader());
                GridView1.DataSource = rstData;
                GridView1.DataBind();
            }
        }
    }

我们现在有了这个:

在此处输入图像描述

好的,所以现在我们希望这个 gv 每 8 分钟刷新一次。

因此,在您的 web 页面中,放入脚本管理器,然后放入计时器控件。

我们有这个:

在此处输入图像描述

现在,go 到定时器上的事件,并选择这个:

在此处输入图像描述

(您可以在滴答事件中双击它,将创建存根后面的代码。

所以,现在我们有了这个:

    protected void Timer1_Tick(object sender, EventArgs e)
    {
        LoadGrid();
    }

因此,该代码存根现在将每 8 分钟触发一次

(8 x 60 = 840 x 1000)

您指定的时间是每 1000 毫秒(因此 1000 = 1 秒)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM