簡體   English   中英

Signalr-閑置一段時間后運行任務

[英]Signalr - Run task after period of inactivity

我想在一段時間不活動(無論是否連接客戶端)后調用一個函數,以清理/處置數據。 基本上,我為每個已連接的客戶端創建一個新的類實例,並將其存儲在Dictionary中,但是如果該客戶端在一段時間內處於非活動狀態/斷開連接,則我不希望將該實例保留在那里。分鍾)以釋放內存。 Signalr有可能嗎?

您可以使用集線器中的OnDisconnected事件來了解客戶端何時處於非活動狀態,並清除內存。

公共重寫Task OnDisconnected(){//釋放您的內存在這里返回base.OnDisconnected(); }

您可以配置斷開連接事件的時間段

在這里找到我的答案。 基本上,您可以像這樣創建一個變量:

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));
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM