ASP.Net 计时器在更改后保持原始时间

本文关键字:原始 时间 Net 计时器 ASP | 更新日期: 2023-09-27 18:34:20

我在使用 C# 的 ASP.NET 代码中有一个计时器,我立即更改它的 Interval,但是在服务器上运行时它实际上永远不会坚持。 计时器每 10 秒继续触发一次。 我希望它在前 10 秒后触发,LoadReport()执行我的代码,然后等待 5 分钟每隔一段时间触发一次。 奇怪的是在我的本地机器上调试它的行为完全符合预期,只是不在它将运行的服务器上。 我做错了什么?

更新:这似乎是一个视图状态问题,但是我不知道如何解决它。 计时器不仅没有保持它的间隔,而且当我在页面上制作图表时 可见 它们不可见。 就好像在服务器上,对页面视图的任何动态代码更改都被忽略了,但在开发中却没有。 我尝试重新启动服务器,但这并没有解决问题。

<asp:Timer ID="TimerRefreshDashboards" runat="server" Interval="10000" 
        ontick="TimerRefreshDashboards_Tick" Enabled="False">
protected void TimerRefreshDashboards_Tick(object sender, EventArgs e)
{
    TimerRefreshDashboards.Interval = 300000;
    LoadReport();
}

ASP.Net 计时器在更改后保持原始时间

归根结底,<asp:Timer />控件仍然需要转换为 HTML、javascript 和 CSS 的某种组合,以便您的浏览器理解它。(甚至连Internet Explorer都不理解原始的.NET webforms标签,所以你不能指望chrome,FF等这样做(

当您在浏览器中查看页面的 HTML 源代码并查看 Web 表单标记的位置时,您将看到如下所示的内容:

<script type="text/javascript">
    setTimeout(10000, RunPostBackCode(args);
</script>

该标记的细节将由 .NET 生成,但可以说,10000参数取自 Interval 属性。现在,假设您在 C# 中具有该属性。如果重新加载页面,您将看到:

<script type="text/javascript">
    setTimeout(300000, RunPostBackCode(args);
</script>

但是,假设您没有重新加载页面。假设您将其放在 ajax 面板或更新面板中,或者其他什么。如果您不重新加载页面,AKA 不刷新作为 HTML 的纯文本,则原始10000仍然存在。

您不应该将回发视为一种神奇的工具。它们在与普通旧静态.htm文件相同的限制下运行,并且更改服务器上的属性并不一定意味着它们在您修改它们的那一刻在浏览器上更改(尽管有一些技巧可以做到这一点(。回发的工作方式与听起来完全一样,页面必须返回到服务器并使用新值重新加载自身,从而更改 .NET 将 .NET 标记转换为 HTML 的方式,以便显示正确的更改。<asp:Timer />是一个特别奇怪的实例,因为它通常意味着回发行为。

它是一个单服务器环境。它确实有其他更改,.dll上的日期是最新的。我最终手动将几个月前的文件复制回服务器,然后从Visual Studio重新部署,现在似乎已经工作了。我什至不需要改变任何东西。我上面的原始代码现在可以工作了。