aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Manager/ProviderManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/Manager/ProviderManager.cs')
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs43
1 files changed, 27 insertions, 16 deletions
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index 16dfd89455..3cdda2cbb8 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -13,17 +13,13 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Providers;
using System;
-using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
-
using MediaBrowser.Controller.Dto;
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization;
using Priority_Queue;
@@ -69,6 +65,7 @@ namespace MediaBrowser.Providers.Manager
private readonly Func<ILibraryManager> _libraryManagerFactory;
private readonly IMemoryStreamFactory _memoryStreamProvider;
+ private CancellationTokenSource _disposeCancellationTokenSource = new CancellationTokenSource();
/// <summary>
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
@@ -882,6 +879,13 @@ namespace MediaBrowser.Providers.Manager
Tuple<Guid, MetadataRefreshOptions> refreshItem;
var libraryManager = _libraryManagerFactory();
+ if (_disposed)
+ {
+ return;
+ }
+
+ var cancellationToken = _disposeCancellationTokenSource.Token;
+
while (_refreshQueue.TryDequeue(out refreshItem))
{
if (_disposed)
@@ -902,18 +906,22 @@ namespace MediaBrowser.Providers.Manager
var folder = item as Folder;
if (folder != null)
{
- await folder.ValidateChildren(new Progress<double>(), CancellationToken.None).ConfigureAwait(false);
+ await folder.ValidateChildren(new Progress<double>(), cancellationToken).ConfigureAwait(false);
}
}
var artist = item as MusicArtist;
var task = artist == null
- ? RefreshItem(item, refreshItem.Item2, CancellationToken.None)
- : RefreshArtist(artist, refreshItem.Item2);
+ ? RefreshItem(item, refreshItem.Item2, cancellationToken)
+ : RefreshArtist(artist, refreshItem.Item2, cancellationToken);
await task.ConfigureAwait(false);
}
}
+ catch (OperationCanceledException)
+ {
+ break;
+ }
catch (Exception ex)
{
_logger.ErrorException("Error refreshing item", ex);
@@ -928,14 +936,14 @@ namespace MediaBrowser.Providers.Manager
private async Task RefreshItem(BaseItem item, MetadataRefreshOptions options, CancellationToken cancellationToken)
{
- await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);
+ await item.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
// Collection folders don't validate their children so we'll have to simulate that here
var collectionFolder = item as CollectionFolder;
if (collectionFolder != null)
{
- await RefreshCollectionFolderChildren(options, collectionFolder).ConfigureAwait(false);
+ await RefreshCollectionFolderChildren(options, collectionFolder, cancellationToken).ConfigureAwait(false);
}
else
{
@@ -948,25 +956,23 @@ namespace MediaBrowser.Providers.Manager
}
}
- private async Task RefreshCollectionFolderChildren(MetadataRefreshOptions options, CollectionFolder collectionFolder)
+ private async Task RefreshCollectionFolderChildren(MetadataRefreshOptions options, CollectionFolder collectionFolder, CancellationToken cancellationToken)
{
foreach (var child in collectionFolder.Children.ToList())
{
- await child.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);
+ await child.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
if (child.IsFolder)
{
var folder = (Folder)child;
- await folder.ValidateChildren(new Progress<double>(), CancellationToken.None, options, true).ConfigureAwait(false);
+ await folder.ValidateChildren(new Progress<double>(), cancellationToken, options, true).ConfigureAwait(false);
}
}
}
- private async Task RefreshArtist(MusicArtist item, MetadataRefreshOptions options)
+ private async Task RefreshArtist(MusicArtist item, MetadataRefreshOptions options, CancellationToken cancellationToken)
{
- var cancellationToken = CancellationToken.None;
-
var albums = _libraryManagerFactory()
.GetItemList(new InternalItemsQuery
{
@@ -991,7 +997,7 @@ namespace MediaBrowser.Providers.Manager
try
{
- await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);
+ await item.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex)
{
@@ -1009,6 +1015,11 @@ namespace MediaBrowser.Providers.Manager
public void Dispose()
{
_disposed = true;
+
+ if (!_disposeCancellationTokenSource.IsCancellationRequested)
+ {
+ _disposeCancellationTokenSource.Cancel();
+ }
}
}
} \ No newline at end of file