1

DB から 2 分ごとに更新されたデータを取得する必要がある MVC アプリケーションを構築しています。2 分ごとに SP を呼び出し、SignleR でクライアントを更新するセッションごとにタイマーを使用することを考えています。セッションごとにタイマーを保持することについて-このアプリは同時に10,000人のユーザーをサポートします。アドバイスをいただければ幸いです

4

2 に答える 2

0

セッションごとではなく、プロセスごとにタイマーを設定し、それが起動して DB データを処理するたびに、SignalR ブロードキャスト/グループ/個別接続を行う必要があるかどうかを判断する必要があります。

于 2013-08-02T20:09:46.400 に答える
0

アプリケーションのライフサイクルの間持続する単一のタイマーを構築するのはどうですか:

public static class SessionTimer
{
    static _timer = new System.Timers.Timer();
    static List<Action> _delegates = new List<Action>();
    static Dictionary<string, Action> _delegateLookup = new Dictionary<string, Action>();
    static object _lockObj = new Object();

    static SessionTimer()
    {
        _timer.Interval = 120000;
        _timer.Elapsed
        _timer.Start();
    }

    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        foreach (var d in _delegates)
        {
            d();
        }
    }

    public static Enlist(HttpSessionState s, Action d)
    {
        lock (_lockObj)
        {
            _delegates.Add(d);
            _delegateLookup.Add(s.SessionID, d);
        }
    }

    public static Delist(HttpSessionState s)
    {
        lock (_lockObj)
        {
            _delegates.Remove(_delegateLookup[s.SessionID]);
            _delegateLookup.Remove(s.SessionID);
        }
    }
}

あとは、開始時にセッションを登録するだけです。これを行うには、Session_Startハンドラーを取得できます。Global.asax

void Session_Start(object sender, EventArgs e)
{
    SessionTimer.Enlist(HttpContext.Current.Session, someActionHandler);
}

または、いつでも入隊​​できます。

免責事項:私が提供したコードはガイドであり、コンパイルされていません。SessionTimer複数回の参加者を処理できるようにするには、 を変更する必要があります。それを終わらせるのはあなた次第です。

于 2013-08-02T20:22:31.707 に答える