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(); } }
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; } }