diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
index 4f405ea959..5d6749adda 100644
--- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
+++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
@@ -102,6 +102,7 @@
+
@@ -245,6 +246,7 @@
+
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs
index c7f482a7fd..cba4cce219 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs
@@ -13,7 +13,7 @@ namespace ICSharpCode.PackageManagement
public class AddPackageReferenceViewModel : ViewModelBase, IDisposable
{
IPackageManagementSolution solution;
- IPackageManagementEvents packageManagementEvents;
+ IThreadSafePackageManagementEvents packageManagementEvents;
ILicenseAcceptanceService licenseAcceptanceService;
string message;
bool hasError;
@@ -21,7 +21,7 @@ namespace ICSharpCode.PackageManagement
public AddPackageReferenceViewModel(
IPackageManagementSolution solution,
IRegisteredPackageRepositories registeredPackageRepositories,
- IPackageManagementEvents packageManagementEvents,
+ IThreadSafePackageManagementEvents packageManagementEvents,
IPackageActionRunner actionRunner,
ILicenseAcceptanceService licenseAcceptanceService,
ITaskFactory taskFactory)
@@ -62,6 +62,7 @@ namespace ICSharpCode.PackageManagement
packageManagementEvents.AcceptLicenses -= AcceptLicenses;
packageManagementEvents.PackageOperationError -= PackageOperationError;
packageManagementEvents.PackageOperationsStarting -= PackageOperationsStarting;
+ packageManagementEvents.Dispose();
}
void PackageOperationError(object sender, PackageOperationExceptionEventArgs e)
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementWorkbench.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementWorkbench.cs
index ddf64f8340..c1d076d78e 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementWorkbench.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementWorkbench.cs
@@ -7,6 +7,9 @@ namespace ICSharpCode.PackageManagement
{
public interface IPackageManagementWorkbench
{
+ bool InvokeRequired { get; }
+
+ void SafeThreadAsyncCall(Action method, A arg1, B arg2);
void CreateConsolePad();
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IThreadSafePackageManagementEvents.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IThreadSafePackageManagementEvents.cs
new file mode 100644
index 0000000000..bc0b659f8a
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/IThreadSafePackageManagementEvents.cs
@@ -0,0 +1,11 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+
+namespace ICSharpCode.PackageManagement
+{
+ public interface IThreadSafePackageManagementEvents : IPackageManagementEvents, IDisposable
+ {
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementViewModels.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementViewModels.cs
index dc10d8d48e..f8d061f013 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementViewModels.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementViewModels.cs
@@ -27,11 +27,12 @@ namespace ICSharpCode.PackageManagement
{
CreateRegisteredPackageRepositories();
CreateSolution();
+ var packageManagementEvents = new ThreadSafePackageManagementEvents(PackageManagementServices.PackageManagementEvents);
addPackageReferenceViewModel =
new AddPackageReferenceViewModel(
solution,
registeredPackageRepositories,
- PackageManagementServices.PackageManagementEvents,
+ packageManagementEvents,
PackageManagementServices.PackageActionRunner,
new LicenseAcceptanceService(),
new PackageManagementTaskFactory());
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementWorkbench.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementWorkbench.cs
index 74d079666f..742ec7f60e 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementWorkbench.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementWorkbench.cs
@@ -22,5 +22,14 @@ namespace ICSharpCode.PackageManagement
// Force creation of view model.
object control = pad.PadContent.Control;
}
+
+ public bool InvokeRequired {
+ get { return WorkbenchSingleton.InvokeRequired; }
+ }
+
+ public void SafeThreadAsyncCall(Action method, A arg1, B arg2)
+ {
+ WorkbenchSingleton.SafeThreadAsyncCall(method, arg1, arg2);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafePackageManagementEvents.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafePackageManagementEvents.cs
new file mode 100644
index 0000000000..2cdad21cb4
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafePackageManagementEvents.cs
@@ -0,0 +1,178 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using System.Collections.Generic;
+using NuGet;
+
+namespace ICSharpCode.PackageManagement
+{
+ public class ThreadSafePackageManagementEvents : IThreadSafePackageManagementEvents
+ {
+ IPackageManagementEvents unsafeEvents;
+ IPackageManagementWorkbench workbench;
+
+ public ThreadSafePackageManagementEvents(IPackageManagementEvents unsafeEvents)
+ : this(unsafeEvents, new PackageManagementWorkbench())
+ {
+ }
+
+ public ThreadSafePackageManagementEvents(
+ IPackageManagementEvents unsafeEvents,
+ IPackageManagementWorkbench workbench)
+ {
+ this.unsafeEvents = unsafeEvents;
+ this.workbench = workbench;
+
+ RegisterEventHandlers();
+ }
+
+ void RegisterEventHandlers()
+ {
+ unsafeEvents.PackageOperationsStarting += RaisePackageOperationStartingEventIfHasSubscribers;
+ unsafeEvents.PackageOperationError += RaisePackageOperationErrorEventIfHasSubscribers;
+ unsafeEvents.ParentPackageInstalled += RaiseParentPackageInstalledEventIfHasSubscribers;
+ unsafeEvents.ParentPackageUninstalled += RaiseParentPackageUninstalledEventIfHasSubscribers;
+ }
+
+ public void Dispose()
+ {
+ UnregisterEventHandlers();
+ }
+
+ void UnregisterEventHandlers()
+ {
+ unsafeEvents.PackageOperationsStarting -= RaisePackageOperationStartingEventIfHasSubscribers;
+ unsafeEvents.PackageOperationError -= RaisePackageOperationErrorEventIfHasSubscribers;
+ unsafeEvents.ParentPackageInstalled -= RaiseParentPackageInstalledEventIfHasSubscribers;
+ unsafeEvents.ParentPackageUninstalled -= RaiseParentPackageUninstalledEventIfHasSubscribers;
+ }
+
+ void RaisePackageOperationStartingEventIfHasSubscribers(object sender, EventArgs e)
+ {
+ if (PackageOperationsStarting != null) {
+ RaisePackageOperationStartingEvent(sender, e);
+ }
+ }
+
+ void RaisePackageOperationStartingEvent(object sender, EventArgs e)
+ {
+ if (InvokeRequired) {
+ Action