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)