One async call leads to another, and another, all the way up the call stack...

This commit is contained in:
LukePulverenti Luke Pulverenti luke pulverenti
2012-08-19 16:38:31 -04:00
parent 64887fa743
commit 937d27ae9d
38 changed files with 393 additions and 373 deletions

View File

@@ -248,5 +248,47 @@ namespace MediaBrowser.Controller
return list;
}
internal async Task ExecuteMetadataProviders(BaseEntity item, ItemResolveEventArgs args)
{
var supportedProviders = Kernel.Instance.MetadataProviders.Where(i => i.Supports(item));
// Start with non-internet providers. Run them sequentially
foreach (BaseMetadataProvider provider in supportedProviders.Where(i => !i.RequiresInternet))
{
await provider.Fetch(item, args);
}
var internetProviders = supportedProviders.Where(i => i.RequiresInternet);
if (internetProviders.Any())
{
// Now execute internet providers in parallel
await Task.WhenAll(
internetProviders.Select(i => i.Fetch(item, args))
);
}
}
protected override void DisposeComposableParts()
{
base.DisposeComposableParts();
DisposeProviders();
}
/// <summary>
/// Disposes all providers
/// </summary>
private void DisposeProviders()
{
if (MetadataProviders != null)
{
foreach (var provider in MetadataProviders)
{
provider.Dispose();
}
}
}
}
}