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