Signalr -在一段时间不活动后运行任务

本文关键字:运行 任务 不活动 一段时间 Signalr | 更新日期: 2023-09-27 18:12:11

我想在一段时间不活动(无论客户端是否连接)后调用一个函数来清理/处置数据。基本上,我正在为每个连接并将其存储在字典中的客户端创建一个类的新实例,但是如果客户端在一段时间内(例如30分钟)不活动/断开连接以释放内存,我不想保留该实例。这是可能的信号?

Signalr -在一段时间不活动后运行任务

您可以使用您的Hub中的OnDisconnected事件来知道您的客户端何时不活动,并清除您的内存。

public override Task OnDisconnected() {//在这里释放内存返回base.OnDisconnected ();}

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

在这里找到了我的答案。基本上,您可以像这样创建一个变量:

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

当用户访问一个函数时,可以像这样更新最后一次:

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

然后,在global .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));
    }