private async Task ApproveSelectedSeries(bool?approve) { await CancelPipeline(); if (!approve.GetValueOrDefault() || !SelectedSeries.Any()) { SeriesSelected?.Invoke(this, new Series[] { }); return; } DownloadImagesProgress = 0; var selectedSeries = SelectedSeries.Select(vm => vm.Series); // unwrap var request = new GetSeriesImagesRequest { Series = selectedSeries }; request.Progress += (s, e) => { DownloadImagesProgress = e; }; await _searchService.GetSeriesImagesAsync(request, CancellationToken.None); SeriesSelected?.Invoke(this, selectedSeries.ToArray()); SelectedSeries.Clear(); DownloadImagesProgress = 0; }
public async Task GetSeriesImagesAsync(GetSeriesImagesRequest request, CancellationToken ct) { foreach (var series in request.Series) { Validator.ValidateObject(series, new ValidationContext(series), true); } await GetSeriesImagesImpAsync(request, ct); }
internal override async Task GetSeriesImagesImpAsync(GetSeriesImagesRequest request, CancellationToken ct) { var seriesByReq = new Dictionary <DicomCMoveRequest, Series>(); // filled below var remainingImagesByReq = new Dictionary <DicomCMoveRequest, int>(); // filled below var totalImages = request.Series.Sum(s => s.NumberOfSeriesRelatedInstances); object progressLock = new object(); DicomCMoveRequest.ResponseDelegate handler = (req, resp) => { lock (progressLock) { remainingImagesByReq[req] = resp.Remaining; var remainingImages = remainingImagesByReq.Sum(kvp => kvp.Value); var progress = (double)(totalImages - remainingImages) / totalImages; if (progress < 0.99) { request.RaiseProgress((int)(progress * 100)); } } if (resp.Remaining == 0) { var series = seriesByReq[req]; series.ImagesUri = CStoreScp.GetSeriesImagesUri(series.SeriesInstanceUid); request.RaiseSeriesDone(series); } }; foreach (var series in request.Series) { var cmove = series.CreateCMoveRequest(_settings.DicomSettings); cmove.OnResponseReceived += handler; seriesByReq[cmove] = series; remainingImagesByReq[cmove] = series.NumberOfSeriesRelatedInstances; } var client = _settings.DicomSettings.CreateClient(); await client.AddRequestsAsync(seriesByReq.Keys); await client.SendAsync(ct); request.RaiseProgress(100); }
internal override async Task GetSeriesImagesImpAsync(GetSeriesImagesRequest request, CancellationToken ct) { double progress = 0; foreach (var ser in request.Series) { var fsSeries = ser as FileSysSeriesImp; if (fsSeries == null) { _logger.Warning("{service} got unexpected type of series object {@Series}", GetType(), ser); continue; } fsSeries.ImagesUri = fsSeries.SeriesDir; progress++; request.RaiseProgress((int)(progress / request.Series.Count() * 100)); request.RaiseSeriesDone(fsSeries); } await Task.FromResult(true); }
internal abstract Task GetSeriesImagesImpAsync(GetSeriesImagesRequest request, CancellationToken ct);