public async Task BuildDuplicatesResolverView(int[] ids, bool resolveTimeouts, bool resolveSameTime, bool resolveSlowest, bool resolveInErrors) { var handle = uiService.StartIndicateLongOperation("Resolving duplicates..."); try { for (int i = 0; i < ids.Length; i++) { int eid = ids[i]; bool resolved = false; do { var results = await manager.GetResults(eid); var duplicates = DuplicateResolver.Resolve(results.Benchmarks, resolveTimeouts, resolveSameTime, resolveSlowest, resolveInErrors, conflicts => uiService.ResolveDuplicatedResults(eid, conflicts)); if (duplicates == null) { uiService.ShowInfo("Duplicates resolution cancelled.", "Resolution cancelled"); return; // cancelling operation } if (duplicates.Length > 0) { resolved = await results.TryDelete(duplicates); if (resolved) { uiService.ShowInfo(string.Format("{0} item(s) removed from the experiment {1}.", duplicates.Length, eid), "Duplicates resolved"); } else { if (!uiService.AskYesNo( string.Format("Results of the experiment {0} have been changed since resolution started. Resolve again?", eid), "Conflict when saving results")) { return; } } } else { resolved = true; uiService.ShowInfo("There are no duplicates in the experiment " + eid, "No duplicates"); } } while (!resolved); } } catch (Exception ex) { uiService.ShowError(ex, "Error when resolving duplicates"); } finally { uiService.StopIndicateLongOperation(handle); } }