每2分钟更新一次会话

时间:2013-08-01 15:06:08

标签: c# asp.net .net asp.net-mvc

我正在构建一个MVC应用程序,需要每2分钟从数据库获取更新的数据, 我正在考虑每2分钟使用一次Timer会话,并且会使用SignleR更新客户端, 我担心的是每个会话保持定时器 - 这个应用程序将支持10,000个用户 同时, 我很乐意得到一些建议 谢谢

2 个答案:

答案 0 :(得分:0)

每个进程都应该有一个Timer,而不是每个进程,每次触发时都会有DB数据处理,以决定是否应该进行SignalR广播/组/个人连接。

答案 1 :(得分: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才能处理不止一次登记的人员。完成它取决于你。