private void RebuildList() { _menu.Reset(); //add each bookmark to the menu foreach (var bookmark in _applicationData.Bookmarks) { _menu.AddBookmarkSubmenu(bookmark, GetInstanceCommandActions(bookmark)); } //refresh the status of each underlying vagrant instance if (_applicationData.Bookmarks.Count > 0) { _menu.StartWorkingAnimation(); } foreach (var instance in _applicationData.Bookmarks.Select(b => b.VagrantInstance).Distinct(new VagrantInstanceEqualityComparer())) { var process = new VagrantStatusProcess(instance); var bookmarks = _applicationData.Bookmarks.Where( b => new VagrantInstanceEqualityComparer().Equals(b.VagrantInstance, instance)).ToList(); foreach (var bookmark in bookmarks) { bookmark.VagrantInstance.CurrentProcess = process; } using (var worker = new BackgroundWorker()) { worker.DoWork += (sender, args) => { process.Success += state => { _mainApplication.Dispatcher.Invoke(() => instance.CurrentState = state); foreach (var bookmark in bookmarks) { bookmark.VagrantInstance.CurrentProcess = null; } if ( _applicationData.Bookmarks.Select(b => b.VagrantInstance) .Count(i => i.CurrentProcess != null) == 0) { _menu.StopWorkingAnimation(); } process.Dispose(); }; process.Start(); try { process.BeginOutputReadLine(); } catch (Exception) { } process.WaitForExit(); }; worker.RunWorkerAsync(); } } }