/// <summary> /// Halts the current session /// </summary> /// <param name="finalSessionScore">the score of the current session</param> public void SessionEnd(double finalSessionScore) { try { //Is there an existing session open? if (CurrentSessionID == -1) { throw new Exception("There is no session open."); } // merge staging to BestSolutions cache foreach (var stageBsol in MemoryManager.BestSolutionStaging) { // update sessions score stageBsol.SessionScore = finalSessionScore; Dictionary <long, BestSolution> bsDict; if (MemoryManager.BestSolutions.TryGetValue(stageBsol.RneuronId, out bsDict)) { BestSolution bSol; if (bsDict.TryGetValue(stageBsol.SolutionId, out bSol)) { if (stageBsol.SessionScore >= bSol.SessionScore && stageBsol.CycleScore >= bSol.CycleScore && stageBsol.CycleOrder >= bSol.CycleOrder) { bsDict[stageBsol.SolutionId] = stageBsol; } } else { bsDict.Add(stageBsol.SolutionId, stageBsol); } } else { var newDict = new Dictionary <long, BestSolution>(); newDict.Add(stageBsol.SolutionId, stageBsol); MemoryManager.BestSolutions.TryAdd(stageBsol.RneuronId, newDict); } } MemoryManager.BestSolutionStaging.Clear(); // TODO need to change to actual update for the session var session = MemoryManager.Sessions[CurrentSessionID]; session.DateTimeStop = DateTime.Now; session.SessionScore = finalSessionScore; session.Hidden = false; //update session to db MemoryManager.AddSessionUpdateToQueue(session); //Throw the endsession event if (SessionComplete != null) { SessionComplete(CurrentSessionID, this); } LastSessionID = CurrentSessionID; CurrentSessionID = -1; } catch (Exception e) { throw; } }