![](/img/trans.png)
[英]SignalR javascript hub method not firing in IE after a period of inactivity
[英]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.