Browse Source

Fix hang caused by Package Management console on closing SharpDevelop with a solution open.

pull/15/head
Matt Ward 14 years ago
parent
commit
7cb14bbf56
  1. 1
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs
  2. 11
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs
  3. 24
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsolePad.cs
  4. 5
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs
  5. 7
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs
  6. 20
      src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs
  7. 10
      src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs

1
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs

@ -21,6 +21,7 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -21,6 +21,7 @@ namespace ICSharpCode.PackageManagement.Scripting
void Clear();
void WritePrompt();
void Run();
void ShutdownConsole();
IPackageManagementProject GetProject(string packageSource, string projectName);
IPackageManagementProject GetProject(IPackageRepository sourceRepository, string projectName);

11
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs

@ -58,9 +58,7 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -58,9 +58,7 @@ namespace ICSharpCode.PackageManagement.Scripting
public void Dispose()
{
if (ScriptingConsole != null) {
ScriptingConsole.Dispose();
}
ShutdownConsole();
if (thread != null) {
thread.Join();
@ -228,5 +226,12 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -228,5 +226,12 @@ namespace ICSharpCode.PackageManagement.Scripting
projectName = GetActiveProjectName(projectName);
return Solution.GetProject(sourceRepository, projectName);
}
public void ShutdownConsole()
{
if (ScriptingConsole != null) {
ScriptingConsole.Dispose();
}
}
}
}

24
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsolePad.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Windows.Threading;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.PackageManagement.Scripting
@ -24,9 +25,32 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -24,9 +25,32 @@ namespace ICSharpCode.PackageManagement.Scripting
public override void Dispose()
{
if (viewModel != null) {
viewModel.ShutdownConsole();
DoEvents();
viewModel.Dispose();
viewModel = null;
}
}
/// <summary>
/// Allow package management console thread to finish. Can be busy if solution was open when the user
/// closed SharpDevelop.
/// </summary>
void DoEvents()
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(
DispatcherPriority.Background,
new DispatcherOperationCallback(ExitFrame),
frame);
Dispatcher.PushFrame(frame);
}
object ExitFrame(object frame)
{
var dispatcherFrame = frame as DispatcherFrame;
dispatcherFrame.Continue = false;
return null;
}
}
}

5
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs

@ -224,5 +224,10 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -224,5 +224,10 @@ namespace ICSharpCode.PackageManagement.Scripting
{
consoleHost.Dispose();
}
public void ShutdownConsole()
{
consoleHost.ShutdownConsole();
}
}
}

7
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs

@ -96,5 +96,12 @@ namespace PackageManagement.Tests.Helpers @@ -96,5 +96,12 @@ namespace PackageManagement.Tests.Helpers
}
public bool IsRunning { get; set; }
public bool IsShutdownConsoleCalled;
public void ShutdownConsole()
{
IsShutdownConsoleCalled = true;
}
}
}

20
src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs

@ -525,5 +525,25 @@ namespace PackageManagement.Tests.Scripting @@ -525,5 +525,25 @@ namespace PackageManagement.Tests.Scripting
Assert.IsTrue(executed);
}
[Test]
public void ShutdownConsole_ScriptingConsoleCreated_DisposesScriptingConsole()
{
CreateHost();
host.ShutdownConsole();
bool disposed = host.FakeScriptingConsole.IsDisposeCalled;
Assert.IsTrue(disposed);
}
[Test]
public void ShutdownConsole_ScriptingConsoleIsNull_NullReferenceExceptionIsNotThrown()
{
CreateHost();
host.ScriptingConsole = null;
Assert.DoesNotThrow(() => host.ShutdownConsole());
}
}
}

10
src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs

@ -500,5 +500,15 @@ namespace PackageManagement.Tests.Scripting @@ -500,5 +500,15 @@ namespace PackageManagement.Tests.Scripting
Assert.IsTrue(consoleHost.IsRunCalled);
}
[Test]
public void ShutdownConsole_NewViewModelCreated_ScriptingConsoleIsShutdown()
{
CreateViewModel();
viewModel.ShutdownConsole();
bool shutdownConsole = consoleHost.IsShutdownConsoleCalled;
Assert.IsTrue(shutdownConsole);
}
}
}

Loading…
Cancel
Save