diff --git a/src/Renci.SshNet/ShellStream.cs b/src/Renci.SshNet/ShellStream.cs
index ea347708..b4a2345e 100644
--- a/src/Renci.SshNet/ShellStream.cs
+++ b/src/Renci.SshNet/ShellStream.cs
@@ -698,7 +698,7 @@ namespace Renci.SshNet
}
///
- /// Unsubscribes the current from session events.
+ /// Unsubscribes the current from session events.
///
/// The session.
///
diff --git a/src/Renci.SshNet/SubsystemSession.cs b/src/Renci.SshNet/SubsystemSession.cs
index f48d8cd1..629b4d0d 100644
--- a/src/Renci.SshNet/SubsystemSession.cs
+++ b/src/Renci.SshNet/SubsystemSession.cs
@@ -126,11 +126,7 @@ namespace Renci.SshNet
///
public void Disconnect()
{
- if (_session != null)
- {
- _session.ErrorOccured -= Session_ErrorOccured;
- _session.Disconnected -= Session_Disconnected;
- }
+ UnsubscribeFromSessionEvents(_session);
if (_channel != null)
{
@@ -274,6 +270,22 @@ namespace Renci.SshNet
throw new InvalidOperationException("The session is not open.");
}
+ ///
+ /// Unsubscribes the current from session events.
+ ///
+ /// The session.
+ ///
+ /// Does nothing when is null.
+ ///
+ private void UnsubscribeFromSessionEvents(ISession session)
+ {
+ if (session == null)
+ return;
+
+ session.Disconnected -= Session_Disconnected;
+ session.ErrorOccured -= Session_ErrorOccured;
+ }
+
#region IDisposable Members
private bool _isDisposed;
@@ -293,36 +305,39 @@ namespace Renci.SshNet
/// true to release both managed and unmanaged resources; false to release only unmanaged resources.
protected virtual void Dispose(bool disposing)
{
- // Check to see if Dispose has already been called.
- if (!_isDisposed)
+ if (_isDisposed)
+ return;
+
+ if (disposing)
{
- if (disposing)
+ Disconnect();
+
+ _session = null;
+
+ if (_errorOccuredWaitHandle != null)
{
- Disconnect();
+ _errorOccuredWaitHandle.Dispose();
+ _errorOccuredWaitHandle = null;
+ }
- _session = null;
+ if (_sessionDisconnectedWaitHandle != null)
+ {
+ _sessionDisconnectedWaitHandle.Dispose();
+ _sessionDisconnectedWaitHandle = null;
+ }
- if (_errorOccuredWaitHandle != null)
- {
- _errorOccuredWaitHandle.Dispose();
- _errorOccuredWaitHandle = null;
- }
-
- if (_sessionDisconnectedWaitHandle != null)
- {
- _sessionDisconnectedWaitHandle.Dispose();
- _sessionDisconnectedWaitHandle = null;
- }
-
- if (_channelClosedWaitHandle != null)
- {
- _channelClosedWaitHandle.Dispose();
- _channelClosedWaitHandle = null;
- }
+ if (_channelClosedWaitHandle != null)
+ {
+ _channelClosedWaitHandle.Dispose();
+ _channelClosedWaitHandle = null;
}
_isDisposed = true;
}
+ else
+ {
+ UnsubscribeFromSessionEvents(_session);
+ }
}
///