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
path: root/main
diff options
context:
space:
mode:
authorMatt Ward <matt.ward@xamarin.com>2015-12-15 22:58:39 +0300
committerMatt Ward <matt.ward@xamarin.com>2015-12-16 13:14:20 +0300
commit874d975fcb3f8f9cebcd7a9fc9299be591b11bf7 (patch)
treeb67d055d2cddb8e53d3ef742ffab464123ce8359 /main
parentdb5f99bad79b1626a465cb685698e32781fd0ac8 (diff)
[NuGet] Stop using DispatcherService.
The NuGet addin no longer uses the DispatcherService to run package actions in the background. It now uses its own background thread to queue and run these actions. Due to being unable to use the original DispatcherService's BackgroundDispatchAndWait without locking up the UI the PackageManagementProjectOperations.InstallPackages has been changed to return when the package install has started. Previously it would wait until the packages were finished installing. Also the PackageManagementProjectOperations.GetIstalledPackages now returns installed packages as well as those being installed. This prevents a Xamarin Component that installs a NuGet package from showing an error when it is installed. Unfortunately one side effect of this change is that if the NuGet package fails to install the Component does not show an error icon when previously it did since originally the packages were installed and then the list of packages was checked. Now this happens whilst the packages are being installed.
Diffstat (limited to 'main')
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/PackageManagementStartupHandler.cs4
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesHandler.cs2
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs2
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/AddPackagesDialog.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs31
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableCheckForUpdatesTaskRunner.cs5
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs46
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj1
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs17
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatedPackagesAction.cs2
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatesTaskRunner.cs4
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageCompatibilityRunner.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementBackgroundDispatcher.cs96
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs28
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs1
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreBeforeUpdateAction.cs2
16 files changed, 145 insertions, 102 deletions
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/PackageManagementStartupHandler.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/PackageManagementStartupHandler.cs
index 2923b1732c..60e1ecefc1 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/PackageManagementStartupHandler.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/PackageManagementStartupHandler.cs
@@ -62,7 +62,7 @@ namespace MonoDevelop.PackageManagement.Commands
// the check for updates starts. Otherwise the check for updates finishes
// before the solution loads and the status bar never reports that
// package updates were being checked.
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
CheckForUpdates ();
});
}
@@ -91,7 +91,7 @@ namespace MonoDevelop.PackageManagement.Commands
bool checkUpdatesAfterRestore = ShouldCheckForUpdates && AnyProjectHasPackages ();
var restorer = new PackageRestorer (projectService.OpenSolution.Solution);
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
restorer.Restore ();
if (checkUpdatesAfterRestore && !restorer.RestoreFailed) {
CheckForUpdates ();
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesHandler.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesHandler.cs
index dea452c44d..208dd75003 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesHandler.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesHandler.cs
@@ -42,7 +42,7 @@ namespace MonoDevelop.PackageManagement.Commands
protected override void Run ()
{
var runner = new PackageRestoreRunner ();
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
runner.Run ();
});
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs
index cd12b8ef75..d130b4b906 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs
@@ -40,7 +40,7 @@ namespace MonoDevelop.PackageManagement.Commands
ProgressMonitorStatusMessage progressMessage = ProgressMonitorStatusMessageFactory.CreateRestoringPackagesInProjectMessage ();
var runner = new PackageRestoreRunner ();
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
runner.Run (project, progressMessage);
});
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/AddPackagesDialog.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/AddPackagesDialog.cs
index 22c835f102..be46db225f 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/AddPackagesDialog.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/AddPackagesDialog.cs
@@ -28,6 +28,7 @@ using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
+using System.Threading.Tasks;
using MonoDevelop.PackageManagement;
using Mono.Unix;
using MonoDevelop.Core;
@@ -446,7 +447,7 @@ namespace MonoDevelop.PackageManagement
// Workaround: Image loading is incorrectly being done on GUI thread
// since the wrong synchronization context seems to be used. So
// here we switch to a background thread and then back to the GUI thread.
- DispatchService.BackgroundDispatch (() => LoadImage (packageViewModel.IconUrl, row));
+ Task.Run (() => LoadImage (packageViewModel.IconUrl, row));
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs
index dedc197577..452deaae32 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs
@@ -35,7 +35,7 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers
{
public class TestableBackgroundPackageActionRunner : BackgroundPackageActionRunner
{
- public List<MessageHandler> BackgroundDispatchersQueued = new List<MessageHandler> ();
+ public List<Action> BackgroundActionsQueued = new List<Action> ();
public TestableBackgroundPackageActionRunner (
IPackageManagementProgressMonitorFactory progressMonitorFactory,
@@ -56,37 +56,26 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers
public void ExecuteSingleBackgroundDispatch ()
{
- BackgroundDispatchersQueued [0].Invoke ();
- BackgroundDispatchersQueued.RemoveAt (0);
+ BackgroundActionsQueued [0].Invoke ();
+ BackgroundActionsQueued.RemoveAt (0);
}
public void ExecuteBackgroundDispatch ()
{
- foreach (MessageHandler dispatcher in BackgroundDispatchersQueued) {
- dispatcher.Invoke ();
+ foreach (Action action in BackgroundActionsQueued) {
+ action ();
}
- BackgroundDispatchersQueued.Clear ();
+ BackgroundActionsQueued.Clear ();
}
- protected override void BackgroundDispatch (MessageHandler handler)
+ protected override void BackgroundDispatch (Action action)
{
- BackgroundDispatchersQueued.Add (handler);
+ BackgroundActionsQueued.Add (action);
}
- public bool InvokeBackgroundDispatchAndWaitImmediately = true;
-
- protected override void BackgroundDispatchAndWait (MessageHandler handler)
- {
- if (InvokeBackgroundDispatchAndWaitImmediately) {
- handler.Invoke ();
- } else {
- BackgroundDispatchersQueued.Add (handler);
- }
- }
-
- protected override void GuiDispatch (Action handler)
+ protected override void GuiDispatch (Action action)
{
- handler.Invoke ();
+ action ();
}
public Func<ProgressMonitor,
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableCheckForUpdatesTaskRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableCheckForUpdatesTaskRunner.cs
index 6410713a0a..e90cb7a2e9 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableCheckForUpdatesTaskRunner.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableCheckForUpdatesTaskRunner.cs
@@ -41,11 +41,6 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers
{
}
- protected override void GuiBackgroundDispatch (MessageHandler handler)
- {
- handler.Invoke ();
- }
-
protected override void LogError (string message, Exception ex)
{
LoggedErrorMessages.Add (message);
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs
index 552b3b2bc0..ebe2866295 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs
@@ -76,18 +76,6 @@ namespace MonoDevelop.PackageManagement.Tests
runner.Run (progressMessage, actions);
}
- void RunAndWait ()
- {
- runner.InvokeBackgroundDispatchAndWaitImmediately = true;
- runner.RunAndWait (progressMessage, actions);
- }
-
- void RunAndWaitWithoutBackgroundDispatch ()
- {
- runner.InvokeBackgroundDispatchAndWaitImmediately = false;
- runner.RunAndWait (progressMessage, actions);
- }
-
FakeInstallPackageAction AddInstallAction ()
{
var action = new FakeInstallPackageAction (new FakePackageManagementProject (), packageManagementEvents);
@@ -567,26 +555,6 @@ namespace MonoDevelop.PackageManagement.Tests
}
[Test]
- public void IsRunning_OneUninstallActionAndRunAndWaitCalledButDispatcherNotComplete_IsRunningIsTrue ()
- {
- CreateRunner ();
- AddUninstallAction ();
- RunAndWaitWithoutBackgroundDispatch ();
-
- Assert.IsTrue (runner.IsRunning);
- }
-
- [Test]
- public void IsRunning_OneUninstallActionAndRunAndWaitCalledAndDispatcherCompletes_IsRunningIsFalse ()
- {
- CreateRunner ();
- AddUninstallAction ();
- RunAndWait ();
-
- Assert.IsFalse (runner.IsRunning);
- }
-
- [Test]
public void IsRunning_ExceptionThrownRunningBackgroundDispatcher_IsRunningIsFalse ()
{
CreateRunner ();
@@ -599,20 +567,6 @@ namespace MonoDevelop.PackageManagement.Tests
Assert.IsFalse (runner.IsRunning);
}
-
- [Test]
- public void IsRunning_ExceptionThrownRunningBackgroundDispatcherWithRunAndWait_IsRunningIsFalse ()
- {
- CreateRunner ();
- AddUninstallAction ();
- runner.CreateEventMonitorAction = (monitor, packageManagementEvents, progressProvider) => {
- throw new ApplicationException ("Error");
- };
-
- RunAndWait ();
-
- Assert.IsFalse (runner.IsRunning);
- }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
index cee2d2dc34..107006899e 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
@@ -374,6 +374,7 @@
<Compile Include="MonoDevelop.PackageManagement\MonoDevelopProjectManager.cs" />
<Compile Include="MonoDevelop.PackageManagement\MonoDevelopProjectSystem.cs" />
<Compile Include="MonoDevelop.PackageManagement\MonoDevelopProjectSystemFactory.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\PackageManagementBackgroundDispatcher.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="MonoDevelop.PackageManagement.addin.xml" />
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs
index 26cedc9004..d7ad16154e 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs
@@ -89,14 +89,6 @@ namespace MonoDevelop.PackageManagement
}
}
- public void RunAndWait (ProgressMonitorStatusMessage progressMessage, IEnumerable<IPackageAction> actions)
- {
- AddInstallActionsToPendingQueue (actions);
- packageManagementEvents.OnPackageOperationsStarting ();
- runCount++;
- BackgroundDispatchAndWait (() => TryRunActionsWithProgressMonitor (progressMessage, actions.ToList ()));
- }
-
void TryRunActionsWithProgressMonitor (ProgressMonitorStatusMessage progressMessage, IList<IPackageAction> actions)
{
try {
@@ -223,14 +215,9 @@ namespace MonoDevelop.PackageManagement
}
}
- protected virtual void BackgroundDispatch (MessageHandler handler)
- {
- DispatchService.BackgroundDispatch (handler);
- }
-
- protected virtual void BackgroundDispatchAndWait (MessageHandler handler)
+ protected virtual void BackgroundDispatch (Action action)
{
- DispatchService.BackgroundDispatchAndWait (handler);
+ PackageManagementBackgroundDispatcher.Dispatch (action);
}
protected virtual void GuiDispatch (Action handler)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatedPackagesAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatedPackagesAction.cs
index 2d95866fa5..5b7f38e03d 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatedPackagesAction.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatedPackagesAction.cs
@@ -54,7 +54,7 @@ namespace MonoDevelop.PackageManagement
{
// Queue the check for updates with the background dispatcher so
// the NuGet addin does not create another separate Package Console.
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
updatedPackagesInSolution.CheckForUpdates ();
});
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatesTaskRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatesTaskRunner.cs
index d33aa8bd9a..33f1924aa2 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatesTaskRunner.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatesTaskRunner.cs
@@ -132,9 +132,9 @@ namespace MonoDevelop.PackageManagement
return taskToCompare == task;
}
- protected virtual void GuiBackgroundDispatch (MessageHandler handler)
+ protected virtual void GuiBackgroundDispatch (Action action)
{
- DispatchService.BackgroundDispatch (handler);
+ PackageManagementBackgroundDispatcher.Dispatch (action);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageCompatibilityRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageCompatibilityRunner.cs
index 6d46b594b8..1dede8577d 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageCompatibilityRunner.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageCompatibilityRunner.cs
@@ -26,6 +26,7 @@
using System;
using System.Collections.Generic;
+using System.Threading.Tasks;
using MonoDevelop.PackageManagement;
using MonoDevelop.Core;
using MonoDevelop.Ide;
@@ -78,7 +79,7 @@ namespace MonoDevelop.PackageManagement
protected virtual void BackgroundDispatch (MessageHandler handler)
{
- DispatchService.BackgroundDispatch (() => RunInternal ());
+ PackageManagementBackgroundDispatcher.Dispatch (() => RunInternal ());
}
void RunInternal ()
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementBackgroundDispatcher.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementBackgroundDispatcher.cs
new file mode 100644
index 0000000000..1839762c2c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementBackgroundDispatcher.cs
@@ -0,0 +1,96 @@
+//
+// PackageManagementBackgroundDispatcher.cs
+//
+// Author:
+// Todd Berman <tberman@off.net>
+// Lluis Sanchez Gual <lluis@novell.com>
+//
+// Copyright (c) 2005 Todd Berman <tberman@off.net>
+// Copyright (c) 2005 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.PackageManagement
+{
+ class PackageManagementBackgroundDispatcher
+ {
+ static Queue<Action> backgroundQueue = new Queue<Action> ();
+ static ManualResetEvent backgroundThreadWait = new ManualResetEvent (false);
+ static Thread backgroundThread;
+
+ public static void Initialize ()
+ {
+ backgroundThread = new Thread (new ThreadStart (RunDispatcher)) {
+ Name = "NuGet background dispatcher",
+ IsBackground = true,
+ Priority = ThreadPriority.Lowest,
+ };
+ backgroundThread.Start ();
+ }
+
+ static void RunDispatcher ()
+ {
+ while (true) {
+ Action action = null;
+ bool wait = false;
+ lock (backgroundQueue) {
+ if (backgroundQueue.Count == 0) {
+ backgroundThreadWait.Reset ();
+ wait = true;
+ } else
+ action = backgroundQueue.Dequeue ();
+ }
+
+ if (wait) {
+ backgroundThreadWait.WaitOne ();
+ continue;
+ }
+
+ if (action != null) {
+ try {
+ action ();
+ } catch (Exception ex) {
+ LoggingService.LogError ("BackgroundDispatcher error.", ex);
+ }
+ }
+ }
+ }
+
+ public static void Dispatch (Action action)
+ {
+ QueueBackground (action);
+ }
+
+ static void QueueBackground (Action action)
+ {
+ lock (backgroundQueue) {
+ backgroundQueue.Enqueue (action);
+ if (backgroundQueue.Count == 1)
+ backgroundThreadWait.Set ();
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs
index ee2d961cd2..1444eac49e 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs
@@ -40,7 +40,6 @@ namespace MonoDevelop.PackageManagement
IPackageManagementSolution solution;
IRegisteredPackageRepositories registeredPackageRepositories;
BackgroundPackageActionRunner backgroundActionRunner;
- IPackageManagementEvents packageManagementEvents;
public PackageManagementProjectOperations (
IPackageManagementSolution solution,
@@ -51,7 +50,6 @@ namespace MonoDevelop.PackageManagement
this.solution = solution;
this.registeredPackageRepositories = registeredPackageRepositories;
this.backgroundActionRunner = backgroundActionRunner;
- this.packageManagementEvents = packageManagementEvents;
packageManagementEvents.ParentPackageInstalled += PackageInstalled;
packageManagementEvents.ParentPackageUninstalled += PackageUninstalled;
@@ -79,7 +77,7 @@ namespace MonoDevelop.PackageManagement
}).Wait ();
ProgressMonitorStatusMessage progressMessage = GetProgressMonitorStatusMessages (actions);
- backgroundActionRunner.RunAndWait (progressMessage, actions);
+ backgroundActionRunner.Run (progressMessage, actions);
}
IPackageRepository CreatePackageRepository (string packageSourceUrl)
@@ -103,11 +101,31 @@ namespace MonoDevelop.PackageManagement
string url = RegisteredPackageSources.DefaultPackageSourceUrl;
var repository = registeredPackageRepositories.CreateRepository (new PackageSource (url));
IPackageManagementProject packageManagementProject = solution.GetProject (repository, new DotNetProjectProxy ((DotNetProject)project));
- return packageManagementProject
+
+ var packages = packageManagementProject
.GetPackageReferences ()
.Select (packageReference => new PackageManagementPackageReference (packageReference.Id, packageReference.Version.ToString ()))
- .ToList ();
+ .ToList ();
+
+ packages.AddRange (GetMissingPackagesBeingInstalled (packages, (DotNetProject)project));
+ return packages;
}).Result;
+ }
+
+ IEnumerable<PackageManagementPackageReference> GetMissingPackagesBeingInstalled (
+ IEnumerable<PackageManagementPackageReference> existingPackages,
+ DotNetProject project)
+ {
+ return GetPackagesBeingInstalled (project)
+ .Where (package => !existingPackages.Any (existingPackage => existingPackage.Id == package.Id));
+ }
+
+ static IEnumerable<PackageManagementPackageReference> GetPackagesBeingInstalled (DotNetProject project)
+ {
+ return PackageManagementServices.BackgroundPackageActionRunner.PendingInstallActionsForProject (project)
+ .Select (installAction => new PackageManagementPackageReference (
+ installAction.GetPackageId (),
+ installAction.GetPackageVersion ().ToString ()));
}
void PackageUninstalled (object sender, ParentPackageOperationEventArgs e)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs
index 4571ed6e06..559408302c 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs
@@ -81,6 +81,7 @@ namespace MonoDevelop.PackageManagement
projectOperations = new PackageManagementProjectOperations (solution, registeredPackageRepositories, backgroundPackageActionRunner, packageManagementEvents);
InitializeCredentialProvider();
+ PackageManagementBackgroundDispatcher.Initialize ();
}
public static void InitializeCredentialProvider()
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreBeforeUpdateAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreBeforeUpdateAction.cs
index 363f47894b..5cb25cd213 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreBeforeUpdateAction.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreBeforeUpdateAction.cs
@@ -83,7 +83,7 @@ namespace MonoDevelop.PackageManagement
{
ProgressMonitorStatusMessage progressMessage = ProgressMonitorStatusMessageFactory.CreateRestoringPackagesBeforeUpdateMessage ();
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
restorer.Restore (progressMessage);
if (!restorer.RestoreFailed) {
afterRestore ();