private static void HandleContextCleanupThread() { while (true) { Thread.Sleep(100); List <Context> currentConnections = new List <Context>(); lock (CurrentConnections) { currentConnections.AddRange(CurrentConnections); } foreach (var connection in currentConnections) { if (!connection.Connected) { lock (CurrentConnections) { CurrentConnections.Remove(connection); } lock (ContextMapping) { ContextMapping.Remove(connection); } connection.Handler.UnregisterContext(connection); connection.Dispose(); } } } }
private static void HandleContextCleanupThread() { while (!Handler.Shutdown.IsCancellationRequested) { Thread.Sleep(100); List <Context> currentConnections = new List <Context>(); lock (CurrentConnections) { currentConnections.AddRange(CurrentConnections); } foreach (var connection in currentConnections) { if (Handler.Shutdown.IsCancellationRequested) { break; } if (!connection.Connected) { lock (CurrentConnections) { CurrentConnections.Remove(connection); } lock (ContextMapping) { ContextMapping.Remove(connection); } connection.Handler.UnregisterContext(connection); connection.Close(); } } } }
private async Task <IActionResult> MutateContextRecord(HashSet <string> userIdStrings, string contextid, bool throw404OnNull, Action <ContextMapping> MutatorFunc, Func <ContextMapping, IActionResult> BuildSuccessResponse) { if (contextid == null || contextid.Trim().Count() == 0) { return(StatusCode(400, "contextid query parameter must not be null or empty!")); } // Get all of the user's current context information from the context mappings table ContextMapping matchingcontext = await dbContext.ContextMappings.FirstOrDefaultAsync(e => userIdStrings.Contains(e.UserId.Trim()) && e.Id.Equals(contextid.Trim())); // Throw 404 if the context does not exist and we are set to NOT implicitly create. if (matchingcontext == null && throw404OnNull) { return(StatusCode(404, $"Context with id-string: {contextid} does not exist. You can not rename a context which does not exist!")); } // If the matching context is null, but don't want to throw 404 errors, then we should implicitly create the context! else if (matchingcontext == null) { string userId = User.FindFirst(googleSubjectClaimType).Value.Trim(); matchingcontext = ContextMapping.BuildNewContext(contextid, userId); MutatorFunc(matchingcontext); dbContext.ContextMappings.AddRange(matchingcontext); await dbContext.SaveChangesAsync(); return(BuildSuccessResponse(matchingcontext)); } // Apply the update, and save! else { MutatorFunc(matchingcontext); dbContext.ContextMappings.Update(matchingcontext); await dbContext.SaveChangesAsync(); return(BuildSuccessResponse(matchingcontext)); } }
private async Task <IList <ContextMapping> > DetectNewContexts(IList <GenericTodoEvent> events, string userId) { // Gather all of the current context data, in order to determine if we have any new contexts implied in the events we were just passed. List <ContextMapping> currentContexts = await dbContext.ContextMappings.Where(e => e.UserId.Equals(userId)).ToListAsync(); HashSet <string> existingContextIds = currentContexts.Select(c => c.Id).ToHashSet(); return(events.Where(e => !existingContextIds.Contains(e.Context)).Select(e => e.Context).ToHashSet().Select(s => ContextMapping.BuildNewContext(s, userId)).ToList()); }