private static async Task <bool> OnRelease(ArenaSession s) { var l = s.GetLock(); try { using (var t = EndSession(s)) { if (await t) { lock (sessions) { if (s._locks == 0) { s.Session = null; sessions.Remove(s.Email); s.Dispose(); return(true); } } } } } catch (Exception e) { Util.Logging.Log(e); } finally { l.Dispose(); } return(false); }
private static void Release(ArenaSession s) { lock (sessions) { var b = s._locks == 0; if (!b && --s._locks == 0) { s._released = DateTime.UtcNow; b = true; } if (b) { if (!s.HasSession) { var l = s.TryGetLock(); if (l != null) { try { sessions.Remove(s.Email); s.Dispose(); return; } finally { l.Dispose(); } } } } else { return; } if (releasing != null) { releasing.Enqueue(s); } else { releasing = new Queue <ArenaSession>(); releasing.Enqueue(s); ReleaseAsync(); } } }