public async Task <Scanned> GetEntriesAsync([NotNull] List <IFileInfo> list, string baseId, string baseName, [CanBeNull] IProgress <AsyncProgressEntry> progress, CancellationToken cancellation) { progress?.Report(AsyncProgressEntry.FromStringIndetermitate("Scanning…")); var result = new List <ContentEntryBase>(); var missingContent = false; Exception readException = null; var s = Stopwatch.StartNew(); var root = new DirectoryNode(_installationParams.FallbackId ?? baseId, null); root.ForceName(baseName); foreach (var info in list) { root.Add(info); } Logging.Debug($"Building tree: {s.Elapsed.TotalMilliseconds:F1} ms"); s.Restart(); var queue = new Queue <DirectoryNode>(); queue.Enqueue(root); while (queue.Count > 0) { var directory = queue.Dequeue(); ContentEntryBase found; try { found = await CheckDirectoryNode(directory, cancellation).ConfigureAwait(false); // WHY IT DOES NOT WORK? if (cancellation.IsCancellationRequested) { break; } } catch (Exception e) when(e.IsCancelled()) { break; } catch (MissingContentException) { missingContent = true; continue; } catch (Exception e) { Logging.Warning(e); readException = e; continue; } if (found != null) { result.Add(found); } else { foreach (var value in directory.Directories) { queue.Enqueue(value); } foreach (var value in directory.Files) { try { found = await CheckFileNode(value, cancellation).ConfigureAwait(false); if (cancellation.IsCancellationRequested) { break; } } catch (Exception e) when(e.IsCancelled()) { break; } catch (MissingContentException) { missingContent = true; continue; } catch (Exception e) { Logging.Warning(e); readException = e; continue; } if (found != null) { result.Add(found); } } } } Logging.Debug($"Scanning directories: {s.Elapsed.TotalMilliseconds:F1} ms"); return(new Scanned(result, missingContent, readException)); }