代码之家  ›  专栏  ›  技术社区  ›  Dalbir Singh

Ajax TimerControl和实例变量?

  •  3
  • Dalbir Singh  · 技术社区  · 16 年前

    在使用Ajax计时器控件时,我在尝试写入页面类的实例成员时遇到了一个问题。

    我已经建立了一个非常简单的粗糙例子,下面模拟了我遇到的确切问题…

    下面的代码使用计时器控件每秒执行一个名为“updateText”的方法。每次调用该方法时,它都会将计数器变量递增一个,以说明计时器控件进行回调的次数。

    当然,为了将计数器的值读取到网页上,标签位于一个更新面板内,该面板带有一个与计时器关联的触发器。

    Markup:

    <form id="form1" runat="server">
    <div>
    
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
    
        <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="UpdateText">
        </asp:Timer>
    
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Label runat="server" Text="" ID="lblCounter"></asp:Label>
        </ContentTemplate>
    
        <Triggers>
        <asp:AsyncPostBackTrigger ControlID="Timer1" />
        </Triggers>
        </asp:UpdatePanel>
    
    </div>
    </form>
    

    CodeBehind:

    public partial class TimerControl : System.Web.UI.Page
    {
        private static int loopCounter = 0;
    
    
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    
        public void UpdateText(object sender, EventArgs e)
        {
            lblCounter.Text = loopCounter.ToString();
            loopCounter++;
        }
    
    }
    

    如果你运行这个,你会发现它是有效的,很好,但我不希望“loopcounter”变量是静态的,因为它将应用于整个应用程序级别,所有用户都将读/写同一个变量。

    当我试图删除静态关键字时,loopcounter变量不再更新,它只是保持在零…代码或浏览器(javascript)中没有给出错误。

    我已经找到了一个临时的解决方法,使用会话代替它,它可以很好地工作并保持在用户的上下文中,但是我更喜欢不使用会话,除非我真的需要这样做。

    有人能解释一下为什么“实例”成员不能写入 这样地?为什么它只适用于 静态的?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Ronald Wildenberg    16 年前

    发生这种情况的原因主要是因为HTTP是无状态协议。出现问题的具体原因是,请求完成后,页面实例不会保存在内存中。每次向ASP.NET页发出请求时,都会创建一个新的页实例。您可以通过向页面类中添加一个默认的构造函数并在其中放置一个断点来轻松地检查这一点。

    除了使用会话状态外,还可以使用 viewstate 为此。在这种情况下,这可能是更好的解决方案,因为您使用的数据(计数器)不是特定于用户的,而是特定于页面的。