示例#1
0
        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);
        }
示例#2
0
        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;
        }
示例#3
0
        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);
        }
示例#4
0
 internal abstract Task GetStudySeriesImpAsync(GetStudySeriesRequest request, CancellationToken ct);
示例#5
0
        public async Task GetStudySeriesAsync(GetStudySeriesRequest request, CancellationToken ct)
        {
            Validator.ValidateObject(request.Study, new ValidationContext(request.Study), true);

            await GetStudySeriesImpAsync(request, ct);
        }