C#定时器和/或锁用于更新仪表板小部件

C#定时器和/或锁用于更新仪表板小部件,c#,asp.net,multithreading,timer,signalr,C#,Asp.net,Multithreading,Timer,Signalr,我正在ASP.NET环境中使用SignalR构建一个包含多个小部件的实时仪表板。在所有小部件加载其默认数据后,每个小部件都需要独立地更新其数据。这意味着我正在使用多个计时器来更新他们的数据,这些数据来自数据库 现在我的问题是在上述情况下使用计时器的最佳方式是什么,以及如何确保它是线程安全的 这是我现在使用的代码: public static void Init(){ Stopwatch.Start(); _timer = new Timer(_ =>

我正在ASP.NET环境中使用SignalR构建一个包含多个小部件的实时仪表板。在所有小部件加载其默认数据后,每个小部件都需要独立地更新其数据。这意味着我正在使用多个计时器来更新他们的数据,这些数据来自数据库

现在我的问题是在上述情况下使用计时器的最佳方式是什么,以及如何确保它是线程安全的

这是我现在使用的代码:

public static void Init(){      

    Stopwatch.Start();

    _timer = new Timer(_ =>
    {
        if (_updating)
        {
            return;
        }
        _updating = true;

        try
        {
            var timeDiffSecs = Stopwatch.Elapsed.TotalSeconds;
            Stopwatch.Restart();

            if (timeDiffSecs <= 0)
            {
                return;
            }

            //DoMyActionForUpdate
        }
        finally
        {
            _updating = false;
        }
    }, null, TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(3));
}
publicstaticvoidinit(){
秒表。开始();
_计时器=新计时器(=>
{
如果(_更新)
{
返回;
}
_更新=真;
尝试
{
var timeDiffSecs=秒表.appeased.TotalSeconds;
Stopwatch.Restart();

如果(timeDiffSecs同时调用
System.Timers.Timer
System.Threading.Timer
调用
appeased
事件和回调(分别使用线程池线程)。(您还没有详细说明使用的是哪一个),这意味着它将(或至少可能是)运行在不同于任何其他计时器的线程上。这与启动多个线程相同——您需要使这些例程线程安全

无论这些线程是如何启动的,技术都是一样的。任何可以在线程之间共享的数据,如果不能以原子方式访问,则需要与其他线程同步。这通常是通过
lock
关键字来完成的。您没有提供任何似乎使用任何共享数据的代码;但是,您确实提到了access到数据库。如果您有到数据库的共享连接,则必须确保一次只有一个线程使用该连接。例如:

lock(locker)
{
        SqlCommand command = new SqlCommand(queryString, connection);
        command.ExecuteNonQuery();}
}
这显示了名为“locker”的字段的使用情况。您需要创建该字段(只是一个
对象
),并在所有线程之间共享该字段


如果你提供更多关于你正在做的事情的细节,特别是,有人可能会提供更详细的答案。

你在GUI中使用什么框架-WPF、Windows窗体等?什么样的计时器?如果是
Dispatcher
或Windows.Forms.timer,它将在UI线程上运行…@dsolimano他说他在使用信号R和ASP.NET。没有GUI。