public void TaskStatusChanged(string Owner, string taskId, SandboxDatabaseManager.Tasks.TaskStatus status) { if(!Stats.ContainsKey(Owner)) { lock(Stats) { // now check once more this time in locked state. if (!Stats.ContainsKey(Owner)) { Stats[Owner] = new List<BackgroundTasksStat>(); } } } var tasks = Stats[Owner]; List<StatItem> resultToSend; lock (tasks) { var taskRetrieved = tasks.FirstOrDefault(item => item.TaskID == taskId); if(taskRetrieved != null) { taskRetrieved.Status = status; } else { tasks.Add(new BackgroundTasksStat(taskId, status)); } resultToSend = tasks.GroupBy(item => item.Status).Select(item => new StatItem() { Status = item.Key.ToString(), Count = item.Count() }).ToList(); } if (!resultToSend.Any(item => item.Status == SandboxDatabaseManager.Tasks.TaskStatus.Running.ToString())) resultToSend.Add(new StatItem() { Status = SandboxDatabaseManager.Tasks.TaskStatus.Running.ToString(), Count = 0 }); if (!resultToSend.Any(item => item.Status == SandboxDatabaseManager.Tasks.TaskStatus.Failed.ToString())) resultToSend.Add(new StatItem() { Status = SandboxDatabaseManager.Tasks.TaskStatus.Failed.ToString(), Count = 0 }); if (!resultToSend.Any(item => item.Status == SandboxDatabaseManager.Tasks.TaskStatus.Succeeded.ToString())) resultToSend.Add(new StatItem() { Status = SandboxDatabaseManager.Tasks.TaskStatus.Succeeded.ToString(), Count = 0 }); List<string> userConnections; if(UsersToConnections.TryGetValue(Owner, out userConnections)) { lock (userConnections) { List<string> problematicConnectionsToRemove = new List<string>(); foreach (string connection in userConnections) { try { Clients.Client(connection).updateBackgroundTaskStats(resultToSend); } catch (Exception ex) { problematicConnectionsToRemove.Add(connection); Log.Error("Exception while updating background task stats to client.", ex); } } foreach (var toRemove in problematicConnectionsToRemove) { userConnections.Remove(toRemove); } } } }
public BackgroundTasksStat(string taskID, SandboxDatabaseManager.Tasks.TaskStatus status) { TaskID = taskID; Status = status; }