private SearchFileContentsResult DoSearchFileContents(SearchContentsData searchContentsData, int maxResults, CancellationToken cancellationToken) { var taskResults = new TaskResultCounter(maxResults); var searchedFileCount = 0; var matches = _currentFileDatabase.FilesWithContents .AsParallel() .WithExecutionMode(ParallelExecutionMode.ForceParallelism) .WithCancellation(cancellationToken) .Where(x => !taskResults.Done) .Select(item => { Interlocked.Increment(ref searchedFileCount); return(MatchFileContents(item, searchContentsData, taskResults)); }) .Where(r => r != null) .ToList(); return(new SearchFileContentsResult { Entries = matches, SearchedFileCount = searchedFileCount, TotalFileCount = _currentFileDatabase.FilesWithContents.Count, HitCount = taskResults.Count, }); }
private static FileSearchResult MatchFileContents(FileData fileData, SearchContentsData searchContentsData, TaskResultCounter taskResultCounter) { var spans = fileData.Contents.Search(searchContentsData); if (spans.Count == 0) { return(null); } taskResultCounter.Add(spans.Count); return(new FileSearchResult { FileName = fileData.FileName, Spans = spans }); }