diff --git a/Source/FileManager/BackgroundFileSystem.cs b/Source/FileManager/BackgroundFileSystem.cs index e4ec7db2..4dec3b8a 100644 --- a/Source/FileManager/BackgroundFileSystem.cs +++ b/Source/FileManager/BackgroundFileSystem.cs @@ -3,15 +3,16 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using System.Threading.Tasks; #nullable enable namespace FileManager { - /// - /// Tracks actual locations of files. - /// - public class BackgroundFileSystem + /// + /// Tracks actual locations of files. + /// + public class BackgroundFileSystem : IDisposable { public LongPath RootDirectory { get; private set; } public string SearchPattern { get; private set; } @@ -21,7 +22,7 @@ namespace FileManager private BlockingCollection? directoryChangesEvents { get; set; } private Task? backgroundScanner { get; set; } - private object fsCacheLocker { get; } = new(); + private Lock fsCacheLocker { get; } = new(); private List fsCache { get; } = new(); public BackgroundFileSystem(LongPath rootDirectory, string searchPattern, SearchOption searchOptions) @@ -100,7 +101,6 @@ namespace FileManager private void FileSystemWatcher_Error(object sender, ErrorEventArgs e) { - Stop(); Init(); } @@ -181,8 +181,12 @@ namespace FileManager fsCache.Add(newFile); } - #endregion + #endregion - ~BackgroundFileSystem() => Stop(); - } + public void Dispose() + { + Stop(); + GC.SuppressFinalize(this); + } + } } diff --git a/Source/LibationFileManager/AudibleFileStorage.cs b/Source/LibationFileManager/AudibleFileStorage.cs index a298777e..0213038c 100644 --- a/Source/LibationFileManager/AudibleFileStorage.cs +++ b/Source/LibationFileManager/AudibleFileStorage.cs @@ -129,7 +129,7 @@ namespace LibationFileManager => BookDirectoryFiles ??= newBookDirectoryFiles(); private static BackgroundFileSystem? BookDirectoryFiles { get; set; } - private static object bookDirectoryFilesLocker { get; } = new(); + private static Lock bookDirectoryFilesLocker { get; } = new(); private static EnumerationOptions enumerationOptions { get; } = new() { RecurseSubdirectories = true, @@ -148,8 +148,13 @@ namespace LibationFileManager { // If user changed the BooksDirectory: reinitialize lock (bookDirectoryFilesLocker) + { if (BooksDirectory != BookDirectoryFiles?.RootDirectory) + { + BookDirectoryFiles?.Dispose(); BookDirectoryFiles = newBookDirectoryFiles(); + } + } var regex = GetBookSearchRegex(productId); var diskFiles = BookDirectoryFiles?.FindFiles(regex) ?? []; @@ -167,9 +172,10 @@ namespace LibationFileManager public void Refresh() { - if (BookDirectoryFiles is null && BooksDirectory is not null) - lock (bookDirectoryFilesLocker) - BookDirectoryFiles = newBookDirectoryFiles(); + lock (bookDirectoryFilesLocker) + { + BookDirectoryFiles ??= newBookDirectoryFiles(); + } BookDirectoryFiles?.RefreshFiles(); }