替代使用asp:Timer进行客户端更新

问题描述 投票:1回答:1

我有一个asp.net Web应用程序,该应用程序使用计时器来用新数据更新所有客户端。数据不在数据库中,而是在所有客户端共享的公共静态对象中。计时器具有OnTick方法,该方法使用此全局数据更新每个客户端的控件,以便所有客户端都可以查看最新数据。我想相当快地更新数据,所以我将计时器的间隔设置为1秒。

自实施此计时器以来,我一直看到的问题是有时按下按钮无法执行任何操作。有时(随机),用户必须单击按钮两次或更多次才能发生任何事情,而其他情况下,单击第一次起作用。我的猜测是按钮按下没有效果,因为它们是在计时器执行OnTick方法的同时被按下的(如果我错了,请纠正我)。我将计时器间隔设置为更长的时间,但没有看到这些无效的按钮按下,因此我知道这与计时器的干扰有关。

除了使用计时器和OnTick来更新所有客户端控件(不需要每个客户端都发起或请求更新)之外,还有其他选择吗?是否有一种事件驱动的方式来更新所有客户端,而不是依赖计时器(即,所有客户端都根据全局数据的更改/在服务器代码中而不是按固定的间隔调用某个方法来进行更新)?

c# asp.net timer client-server
1个回答
0
投票

这是我在自己的项目中成功使用的模式。我不是asp.net的人,但我相信您可以访问System.Threading.Tasks?如果是这样,请考虑采用这种模式。

[您提到“我的猜测是按钮的按下没有效果,因为它们是在计时器执行OnTick方法的同时按下的。”

此解决方案不会阻止您的UI线程,应该解决这些延迟。 (如果需要进一步澄清,请告诉我。)

void RestartDelay()
{
    Task.Delay(1000)
    .GetAwaiter()
    .OnCompleted(() => 
    { 
        PerformUpdate(); 
    });
}

private void PerformUpdate()
{
    Task.Run(() =>
    {
        Debug.WriteLine(_stopwatch.Elapsed.ToString() + " - Update Controls");
    })
    .GetAwaiter()
    .OnCompleted(()=>
    {
        RestartDelay();
    });
}

......

Stopwatch _stopwatch = new Stopwatch();   

public void Configuration(IAppBuilder app)
{
    ConfigureAuth(app);
    _stopwatch.Start();
    RestartDelay();
}

一件好事是,PerformUpdate可以长期运行。

  • 它阻止正在运行的线程上,它不是UI线程。
  • 它不会触发新的1秒延迟的请求,直到它完成所有操作为止。
  • [您可以从GitHub Clone or Download来测试我用来测试答案并验证此声明的.NET Framework UI项目。
  • enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.