From 937d27ae9d6aa571ab9327f138bfba1b84c158db Mon Sep 17 00:00:00 2001 From: LukePulverenti Luke Pulverenti luke pulverenti Date: Sun, 19 Aug 2012 16:38:31 -0400 Subject: One async call leads to another, and another, all the way up the call stack... --- MediaBrowser.Controller/Kernel.cs | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'MediaBrowser.Controller/Kernel.cs') diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index b696abef5..57e30479b 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -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(); + } + + /// + /// Disposes all providers + /// + private void DisposeProviders() + { + if (MetadataProviders != null) + { + foreach (var provider in MetadataProviders) + { + provider.Dispose(); + } + } + } } } -- cgit v1.2.3