コード例 #1
0
ファイル: SearchService.cs プロジェクト: celeron533/DicomGrep
        public void Search(SearchCriteria criteria, CancellationTokenSource tokenSource)
        {
            logger.Info(criteria.ToString());

            this.criteria = criteria;
            this.token    = tokenSource.Token;

            searchedFileCount = 0;


            if (criteria.SearchInResults)
            {
                // use the filename list from previous search result
                filenameList.Clear();
                filenameList.AddRange(matchedFilenameList);
            }
            else
            {
                // construct new filename list
                CreateFilenameList();
            }

            FileListCompleted?.Invoke(this, new ListFileCompletedEventArgs(filenameList));

            matchedFilenameList.Clear();
            matchedFileCount = 0;

            ParallelOptions options = new ParallelOptions
            {
                MaxDegreeOfParallelism = criteria.SearchThreads,
                CancellationToken      = this.token
            };

            try
            {
                Parallel.ForEach(filenameList, options, (filename, loopStat) =>
                {
                    options.CancellationToken.ThrowIfCancellationRequested();
                    SearchInDicomFile(filename);
                });
                OnSearchComplete?.Invoke(this, new OnSearchCompleteEventArgs {
                    Reason = Enums.ReasonEnum.Normal
                });
            }
            catch (OperationCanceledException)
            {
                OnSearchComplete?.Invoke(this, new OnSearchCompleteEventArgs {
                    Reason = Enums.ReasonEnum.UserCancelled
                });
                logger.Info("User cancelled the search.");
            }
            finally
            {
                tokenSource.Dispose();
            }
        }
コード例 #2
0
        public async Task <ActionResult <List <ResultProxy> > > GetResults(SearchProxy search)
        {
            try
            {
                if (search.ExecutedAt == default)
                {
                    search.ExecutedAt = DateTime.Now;
                }

                // Adds the Search to database, and retrieves it again, to get version with Id generated by the database.
                _ = await handler.Add(search);

                search = await handler.Find(new SearchProxy()
                {
                    Target        = search.Target,
                    DesiredAmount = search.DesiredAmount,
                    Term          = search.Term,
                    Path          = search.Path,
                    ExecutedAt    = search.ExecutedAt
                });

                var results                = new List <ResultProxy>();
                Task <ResultProxy> web     = null;
                Task <ResultProxy> files   = null;
                Task <ResultProxy> folders = null;

                // Initiats different tasks to search specified areas.
                switch (search.Target)
                {
                case Core.Enums.SearchTarget.All:
                    web     = SearchWeb(search);
                    files   = SearchFiles(search);
                    folders = SearchFolders(search);
                    break;

                case Core.Enums.SearchTarget.WebAndFiles:
                    web   = SearchWeb(search);
                    files = SearchFiles(search);
                    break;

                case Core.Enums.SearchTarget.WebAndFolder:
                    web     = SearchWeb(search);
                    folders = SearchFolders(search);
                    break;

                case Core.Enums.SearchTarget.FilesAndFolders:
                    files   = SearchFiles(search);
                    folders = SearchFolders(search);
                    break;

                case Core.Enums.SearchTarget.Web:
                    web = SearchWeb(search);
                    break;

                case Core.Enums.SearchTarget.Files:
                    files = SearchFiles(search);
                    break;

                case Core.Enums.SearchTarget.Folders:
                    folders = SearchFolders(search);
                    break;

                default:
                    break;
                }

                // Awaits the different tasks, and adds the ResultProxy to database and return list.
                // A Check to ensure the tasks have completed succefully, would be an possible improvement
                if (web != null)
                {
                    var awaitedWeb = await web;
                    _ = await handler.Add(awaitedWeb);

                    results.Add(awaitedWeb);
                }

                if (files != null)
                {
                    var awaitedFiles = await files;
                    _ = await handler.Add(awaitedFiles);

                    results.Add(awaitedFiles);
                }

                if (folders != null)
                {
                    var awaitedFolders = await folders;
                    _ = await handler.Add(awaitedFolders);

                    results.Add(awaitedFolders);
                }

                OnSearchComplete?.Invoke(search);
                return(new OkObjectResult(results));
            }
            catch (Exception e)
            {
                throw;
            }
        }