public static async IAsyncEnumerable <IEnumerable <FileInfo> > LoadFilesAsync([NotNull] IEnumerable <DirectoryInfo> directories, [NotNull] string searchPattern, SearchOption searchOption) { directories = directories.ArgumentNotNull(); searchPattern = searchPattern.ArgumentNotNull(); if (searchOption.CheckIsDefined() is false) { searchOption = SearchOption.TopDirectoryOnly; } var options = new EnumerationOptions() { IgnoreInaccessible = true }; if (searchOption == SearchOption.AllDirectories) { options.RecurseSubdirectories = true; } var validDirectories = directories.Where(directory => directory.Exists).Select(directory => directory).ToList(); for (var directoryCount = 0; directoryCount < validDirectories.FastCount(); directoryCount++) { IEnumerable <FileInfo> files = await Task.Run(() => { return(validDirectories[directoryCount].EnumerateFiles(searchPattern, options)); }).ConfigureAwait(false); yield return(files); } }