diff --git a/src/Renci.SshNet/Shell.cs b/src/Renci.SshNet/Shell.cs index 1ed73bb5..d98d9296 100644 --- a/src/Renci.SshNet/Shell.cs +++ b/src/Renci.SshNet/Shell.cs @@ -280,7 +280,7 @@ namespace Renci.SshNet } /// - /// Unsubscribes the current from session events. + /// Unsubscribes the current from session events. /// /// The session. /// diff --git a/src/Renci.SshNet/ShellStream.cs b/src/Renci.SshNet/ShellStream.cs index bb51bbdd..ea347708 100644 --- a/src/Renci.SshNet/ShellStream.cs +++ b/src/Renci.SshNet/ShellStream.cs @@ -14,7 +14,7 @@ namespace Renci.SshNet /// /// Contains operation for working with SSH Shell. /// - public partial class ShellStream : Stream + public class ShellStream : Stream { private const string CrLf = "\r\n"; private const int BufferSize = 1024; @@ -25,6 +25,7 @@ namespace Renci.SshNet private readonly Queue _outgoing; private IChannelSession _channel; private AutoResetEvent _dataReceived = new AutoResetEvent(false); + private bool _isDisposed; /// /// Occurs when data was received. @@ -667,25 +668,49 @@ namespace Renci.SshNet { base.Dispose(disposing); - if (_session != null) - { - _session.Disconnected -= Session_Disconnected; - _session.ErrorOccured -= Session_ErrorOccured; - } + if (_isDisposed) + return; - if (_channel != null) + if (disposing) { - _channel.DataReceived -= Channel_DataReceived; - _channel.Closed -= Channel_Closed; - _channel.Dispose(); - _channel = null; - } + UnsubscribeFromSessionEvents(_session); - if (_dataReceived != null) - { - _dataReceived.Dispose(); - _dataReceived = null; + if (_channel != null) + { + _channel.DataReceived -= Channel_DataReceived; + _channel.Closed -= Channel_Closed; + _channel.Dispose(); + _channel = null; + } + + if (_dataReceived != null) + { + _dataReceived.Dispose(); + _dataReceived = null; + } + + _isDisposed = true; } + else + { + UnsubscribeFromSessionEvents(_session); + } + } + + /// + /// 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; } private void Session_ErrorOccured(object sender, ExceptionEventArgs e)