C# 每2分钟更新一次会话

C# 每2分钟更新一次会话,c#,asp.net,.net,asp.net-mvc,C#,Asp.net,.net,Asp.net Mvc,我正在构建一个MVC应用程序,它需要每隔2分钟从数据库获取更新的数据, 我正在考虑在每个会话中使用计时器,它将每2分钟调用一次SP,并使用SignleR更新客户端, 我担心的是每次会话都会有计时器。这个应用程序将支持10000个用户 同时,, 我很乐意得到一些建议 谢谢您应该为每个进程(而不是每个会话)设置一个计时器,每次它触发并获得DB data process时,您都可以决定是否应该执行信号器广播/组/单个连接。构建一个在应用程序生命周期内持续存在的计时器如何: public static

我正在构建一个MVC应用程序,它需要每隔2分钟从数据库获取更新的数据, 我正在考虑在每个会话中使用计时器,它将每2分钟调用一次SP,并使用SignleR更新客户端, 我担心的是每次会话都会有计时器。这个应用程序将支持10000个用户 同时,, 我很乐意得到一些建议
谢谢

您应该为每个进程(而不是每个会话)设置一个计时器,每次它触发并获得DB data process时,您都可以决定是否应该执行信号器广播/组/单个连接。

构建一个在应用程序生命周期内持续存在的计时器如何:

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);
        }
    }
}
或者你想什么时候入伍就什么时候入伍

免责声明:我提供的代码是一个指南,未编译。您需要修改
SessionTimer
,以便能够处理多次登记的人员。由你来完成它

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