/// <summary> /// Process the result of an AllThreads request. /// </summary> private void ProcessAllThreads(Task<List<ThreadId>> task) { if (!task.CompletedOk()) { DLog.Error(DContext.DebuggerLibModel, "LoadAllThreads failed", task.Exception); task.ForwardException(); return; } List<DalvikThread> created = null; List<DalvikThread> removed = null; lock (threadsLock) { // Create missing threads foreach (var id in task.Result.Where(x => !threads.ContainsKey(x))) { // Create and record var thread = CreateThread(id); threads[id] = thread; list.Add(thread); created = created ?? new List<DalvikThread>(); created.Add(thread); } // Remove obsolete threads var toRemove = threads.Keys.Where(x => !task.Result.Contains(x)).ToList(); foreach (var id in toRemove) { var thread = threads[id]; threads.Remove(id); list.Remove(thread); removed = removed ?? new List<DalvikThread>(); removed.Add(thread); } } if (created != null) created.ForEach(OnThreadCreated); if (removed != null) removed.ForEach(OnThreadEnd); }