1

我正在构建一个 MVC 应用程序,该应用程序需要每 2 分钟从数据库中获取更新的数据,我正在考虑在每个会话中使用 Timer,它将每 2 分钟调用一次 SP 并使用 SignleR 更新客户端,我担心的事情about is to hold Timer per session-这个应用程序将同时支持10,000个用户,我很乐意得到一些建议谢谢

4

2 回答 2

0

您应该每个进程都有一个计时器,而不是每个会话,并且每次它触发并且您获得数据库数据处理它来决定您是否应该进行 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 回答