private void OnWorkspaceChanged(object source, WorkspaceChangeEventArgs args) { SimpleWorkspaceEvent e = null; switch (args.Kind) { case WorkspaceChangeKind.ProjectAdded: e = new SimpleWorkspaceEvent(args.NewSolution.GetProject(args.ProjectId).FilePath, EventTypes.ProjectAdded); break; case WorkspaceChangeKind.ProjectChanged: case WorkspaceChangeKind.ProjectReloaded: e = new SimpleWorkspaceEvent(args.NewSolution.GetProject(args.ProjectId).FilePath, EventTypes.ProjectChanged); break; case WorkspaceChangeKind.ProjectRemoved: e = new SimpleWorkspaceEvent(args.OldSolution.GetProject(args.ProjectId).FilePath, EventTypes.ProjectRemoved); break; } if (e != null) { lock (_lock) { var removed = _queue.Remove(e); _queue.Add(e); if (!removed) { Task.Factory.StartNew(async () => { await Task.Delay(500); object payload = null; if (e.EventType != EventTypes.ProjectRemoved) { payload = await GetProjectInformation(e.FileName); } lock (_lock) { _queue.Remove(e); _emitter.Emit(e.EventType, payload); } }); } } } }