0

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));
}
4

1 に答える 1

1

両方とも、イベントとコールバックを (それぞれ) スレッド プール スレッドでSystem.Timers.Timer呼び出しSystem.Threading.Timerます。Elapsed(どのタイマーを使用しているかは詳しく説明していません)これは、他のタイマーとは異なるスレッドで実行される(または少なくとも実行される可能性がある)ことを意味します。これは、複数のスレッドを開始した場合と同じです。これらのルーチンをスレッドセーフにする必要があります。

これらのスレッドがどのように開始されたかに関係なく、手法は同じです。アトミックにアクセスできないスレッド間で共有できるデータは、他のスレッドと同期する必要があります。これは通常、lockキーワードで行われます。共有データを使用していると思われるコードを提供していません。ただし、データベースへのアクセスについて言及しています。データベースへの共有接続がある場合は、一度に 1 つのスレッドだけがその接続を使用するようにする必要があります。例えば:

lock(locker)
{
        SqlCommand command = new SqlCommand(queryString, connection);
        command.ExecuteNonQuery();}
}

これは、「locker」という名前のフィールドの使用を示しています。これを作成し (単にObject)、使用中のすべてのスレッドで共有する必要があります。

具体的に何をしているかについて詳しく教えてください。誰かがより詳細な答えを提供できるかもしれません。

于 2012-08-11T15:51:31.927 に答える