Sfoglia il codice sorgente

Library: Async the SaveImages function (#15718)

Luigi311 1 settimana fa
parent
commit
771b0a7eab

+ 1 - 1
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -2143,7 +2143,7 @@ namespace Emby.Server.Implementations.Library
 
             item.ValidateImages();
 
-            _itemRepository.SaveImages(item);
+            await _itemRepository.SaveImagesAsync(item).ConfigureAwait(false);
 
             RegisterItem(item);
         }

+ 22 - 10
Jellyfin.Server.Implementations/Item/BaseItemRepository.cs

@@ -547,22 +547,34 @@ public sealed class BaseItemRepository
     }
 
     /// <inheritdoc  />
-    public void SaveImages(BaseItemDto item)
+    public async Task SaveImagesAsync(BaseItemDto item, CancellationToken cancellationToken = default)
     {
         ArgumentNullException.ThrowIfNull(item);
 
-        var images = item.ImageInfos.Select(e => Map(item.Id, e));
-        using var context = _dbProvider.CreateDbContext();
+        var images = item.ImageInfos.Select(e => Map(item.Id, e)).ToArray();
 
-        if (!context.BaseItems.Any(bi => bi.Id == item.Id))
+        var context = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
+        await using (context.ConfigureAwait(false))
         {
-            _logger.LogWarning("Unable to save ImageInfo for non existing BaseItem");
-            return;
-        }
+            if (!await context.BaseItems
+                .AnyAsync(bi => bi.Id == item.Id, cancellationToken)
+                .ConfigureAwait(false))
+            {
+                _logger.LogWarning("Unable to save ImageInfo for non existing BaseItem");
+                return;
+            }
 
-        context.BaseItemImageInfos.Where(e => e.ItemId == item.Id).ExecuteDelete();
-        context.BaseItemImageInfos.AddRange(images);
-        context.SaveChanges();
+            await context.BaseItemImageInfos
+                .Where(e => e.ItemId == item.Id)
+                .ExecuteDeleteAsync(cancellationToken)
+                .ConfigureAwait(false);
+
+            await context.BaseItemImageInfos
+                .AddRangeAsync(images, cancellationToken)
+                .ConfigureAwait(false);
+
+            await context.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
+        }
     }
 
     /// <inheritdoc  />

+ 1 - 1
MediaBrowser.Controller/Persistence/IItemRepository.cs

@@ -33,7 +33,7 @@ public interface IItemRepository
     /// <param name="cancellationToken">The cancellation token.</param>
     void SaveItems(IReadOnlyList<BaseItem> items, CancellationToken cancellationToken);
 
-    void SaveImages(BaseItem item);
+    Task SaveImagesAsync(BaseItem item, CancellationToken cancellationToken = default);
 
     /// <summary>
     /// Retrieves the item.