Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortherzok <marius.ungureanu@xamarin.com>2018-04-25 15:28:42 +0300
committertherzok <marius.ungureanu@xamarin.com>2018-04-26 13:30:16 +0300
commit524dce311ca3fd696cd35001b20192da597c90f9 (patch)
tree94fdb2fa20c30412f2f84afdfe808d4456b3203e
parent797754126ed16b69c277d94e990f77f56113b5fc (diff)
[MEF] Process tasks as they come.
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs23
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) {