private void RemoveApplications(object sender, DoWorkEventArgs e) { var bgWorker = (BackgroundWorker)sender; bgWorker.ReportProgress(1, String.Format("Remove Applications.")); foreach (var app in _applications.Where(x => x.Selected)) { var exists = _catalog.Applications.TryExists(app.Name); if (exists) { var s = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var sp = s + "\\BTFGui\\Binding Files\\"; var spp = sp + app.Name + string.Format(".{0:yyyy-MM-dd_HH-mm-ss}", DateTime.Now) + ".BindingInfo.xml"; _catalog.Applications[app.Name].ExportBinding(spp, true); bgWorker.ReportProgress(1, String.Format("Binding for Application '{0}' Exported to '{1}'.", app.Name, spp)); } } var loop = true; while (loop) { foreach (var app in _applications.Where(x => x.Selected)) { var exists = _catalog.Applications.TryExists(app.Name); if (exists) { bgWorker.ReportProgress(1, String.Format("Removing Application '{0}'...", app.Name)); try { _catalog.RemoveApplication(app.Name, true); bgWorker.ReportProgress(1, String.Format("Application '{0}' Removed.", app.Name)); } catch (Exception ex) { if (ex.InnerException.Message == "Failed to delete resource(s).") { bgWorker.ReportProgress(1, String.Format( "Application '{0}' is referenced by other applications, will retry later.", app.Name)); // possible endless loop!!! // should check for references and retry only 3 times // stupid to try to delete the generic applications... } else { throw ex; } } } } if (!_catalog.Applications.Select(s => s.Name).Intersect(_applications.Select(x => x.Name)).Any()) { loop = false; } } _catalog.SaveChanges(); _catalog.Refresh(); bgWorker.ReportProgress(100, "Applications Removed."); }