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); + } } ///