我有一个asp.net Web应用程序,该应用程序使用计时器来用新数据更新所有客户端。数据不在数据库中,而是在所有客户端共享的公共静态对象中。计时器具有OnTick方法,该方法使用此全局数据更新每个客户端的控件,以便所有客户端都可以查看最新数据。我想相当快地更新数据,所以我将计时器的间隔设置为1秒。
自实施此计时器以来,我一直看到的问题是有时按下按钮无法执行任何操作。有时(随机),用户必须单击按钮两次或更多次才能发生任何事情,而其他情况下,单击第一次起作用。我的猜测是按钮按下没有效果,因为它们是在计时器执行OnTick方法的同时被按下的(如果我错了,请纠正我)。我将计时器间隔设置为更长的时间,但没有看到这些无效的按钮按下,因此我知道这与计时器的干扰有关。
除了使用计时器和OnTick来更新所有客户端控件(不需要每个客户端都发起或请求更新)之外,还有其他选择吗?是否有一种事件驱动的方式来更新所有客户端,而不是依赖计时器(即,所有客户端都根据全局数据的更改/在服务器代码中而不是按固定的间隔调用某个方法来进行更新)?
这是我在自己的项目中成功使用的模式。我不是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可以长期运行。