信号器 - 在不活动一段时间后运行任务

时间:2014-07-10 04:40:18

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

我希望在一段时间不活动后调用函数(无论客户端是否连接)来清理/处理数据。基本上,我正在为连接的每个客户端创建一个类的新实例,并将其存储在Dictionary中,但如果客户端处于非活动状态/断开连接一段时间,我不想将该实例保留在那里(例如30分钟)以释放记忆。这可能与Signalr有关吗?

2 个答案:

答案 0 :(得分:0)

您可以使用集线器中的OnDisconnected事件来了解客户端何时处于非活动状态,并清理内存。

public override Task OnDisconnected(){        //在这里释放你的记忆         return base.OnDisconnected();     }

您可以配置断开连接事件时间段

答案 1 :(得分:0)

找到我的答案here。基本上,你可以像这样创建一个变量:

static public Dictionary<string, DateTime> LastConnectionTime = new Dictionary<string, DateTime>();

每当用户访问某个函数时,您可以像上次那样更新上一次:

LastConnectionTime[Context.User.Identity.Name] = DateTime.Now;

然后,在你的Globals.asax:

    protected void Application_Start()
    {
        // ...

        AddTask("HubInactivity", 120);
    }

    private void AddTask(string name, int seconds)
    {
        OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
        HttpRuntime.Cache.Insert(name, seconds, null,
            DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration,
            CacheItemPriority.NotRemovable, OnCacheRemove);
    }

    public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
    {
        if (k == "HubInactivity")
        {
            var time = DateTime.Now;

            // HubHelpers is where I kept the dictionary in my case
            foreach (var identity in Hubs.HubHelpers.LastConnectionTime.Keys)
            {
                var lastConnection = Hubs.HubHelpers.LastConnectionTime[identity];

                if ((time - lastConnection).TotalMinutes > 30.0)
                {
                    // Do stuff.
                }
            }
        }

        // re-add our task so it recurs
        AddTask(k, Convert.ToInt32(v));
    }