internal override async Task GetStudySeriesImpAsync(GetStudySeriesRequest request, CancellationToken ct) { FileSysStudyImp fsStudy = request.Study as FileSysStudyImp; if (fsStudy == null) { throw new ApplicationException($"The {GetType()} implementation can receive study instances of {typeof(FileSysStudyImp)} only"); } var createSeries = new ActionBlock <string>(async seriesDir => { var series = await CreateFromSeriesDirAsync(seriesDir, (dicomFile) => { return(dicomFile.Dataset.CreateObject(() => new FileSysSeriesImp(seriesDir))); }); if (series != null) { if (series.NumberOfSeriesRelatedInstances < 1) { series.NumberOfSeriesRelatedInstances = Directory.EnumerateFiles(seriesDir).Count(); } series.Study = request.Study; request.RaiseSeriesGot(series); } }, new ExecutionDataflowBlockOptions { CancellationToken = ct, MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded }); foreach (var seriesDir in fsStudy.SeriesDirs) { await createSeries.SendAsync(seriesDir, ct); } createSeries.Complete(); await createSeries.Completion; }
internal override async Task GetStudySeriesImpAsync(GetStudySeriesRequest request, CancellationToken ct) { var dicomRequest = DicomCFindRequest.CreateSeriesQuery(request.Study.StudyInstanceUid); dicomRequest.OnResponseReceived += (req, resp) => { if (!ct.IsCancellationRequested && resp.Dataset != null) { var series = resp.Dataset.CreateObject <Series>(); if (series == null) { _logger.Error("Series creation failed"); } else { series.Study = request.Study; request.RaiseSeriesGot(series); } } }; await FindAsync <Series>(dicomRequest, _settings, _getStudySeriesSemaphore, ct); }