public async Task <bool> LoadSeriesAsync(ISearchService searchService, CancellationToken ct) { if (_loading) { return(false); } lock (_loadingLock) { if (_loading) { return(false); } _loading = true; } var addSeriesBlock = new ActionBlock <Series>(async series => { if (ct.IsCancellationRequested) { return; } await _dispatcher.InvokeAsync(() => { Series.Add(new SeriesVm(series)); }); }, new ExecutionDataflowBlockOptions { CancellationToken = ct }); var request = new GetStudySeriesRequest { Study = Study }; request.SeriesGot += (s, e) => { addSeriesBlock.Post(e); }; await searchService.GetStudySeriesAsync(request, ct);//.ConfigureAwait(false); addSeriesBlock.Complete(); await addSeriesBlock.Completion; return(true); }
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); }
internal abstract Task GetStudySeriesImpAsync(GetStudySeriesRequest request, CancellationToken ct);
public async Task GetStudySeriesAsync(GetStudySeriesRequest request, CancellationToken ct) { Validator.ValidateObject(request.Study, new ValidationContext(request.Study), true); await GetStudySeriesImpAsync(request, ct); }