diff options
author | therzok <marius.ungureanu@xamarin.com> | 2018-04-25 15:28:42 +0300 |
---|---|---|
committer | therzok <marius.ungureanu@xamarin.com> | 2018-04-26 13:30:16 +0300 |
commit | 524dce311ca3fd696cd35001b20192da597c90f9 (patch) | |
tree | 94fdb2fa20c30412f2f84afdfe808d4456b3203e | |
parent | 797754126ed16b69c277d94e990f77f56113b5fc (diff) |
[MEF] Process tasks as they come.
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs index 9259ae9516..20e9647778 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs @@ -129,22 +129,23 @@ namespace MonoDevelop.Ide.Composition ReadAssembliesFromAddins (assemblies, "/MonoDevelop/Ide/TypeService/MefHostServices"); ReadAssembliesFromAddins (assemblies, "/MonoDevelop/Ide/Composition"); timer.Trace ("Gathered assemblies from extension points"); +
+ object lockObject = new object ();
// spawn discovery tasks in parallel for each assembly - var tasks = new Task<DiscoveredParts> [assemblies.Count];
- int i = 0; + var tasks = new List<Task> (assemblies.Count);
foreach (var assembly in assemblies) { - tasks[i++] = Task.Run (() => Discovery.CreatePartsAsync (assembly)); - }
-
- var results = await Task.WhenAll (tasks);
- timer.Trace ("Catalog parts discovered"); - - foreach (var result in results) { - catalog = catalog.AddParts (result); + var task = Task.Run (() => Discovery.CreatePartsAsync (assembly)).ContinueWith (t => {
+ lock (lockObject) { + catalog = catalog.AddParts (t.Result);
+ }
+ return t;
+ });
+ tasks.Add (task); }
- timer.Trace ("Catalog parts added"); + await Task.WhenAll (tasks);
+ timer.Trace ("Catalog parts discovered and added"); var discoveryErrors = catalog.DiscoveredParts.DiscoveryErrors; if (!discoveryErrors.IsEmpty) { |