I'm doing a reboot on a linux machine (dropbear ssh server) and disconnecting as fast as i can after that.
I'm using ssh.net 2014.4.6-beta2
The sshclient hangs in the Disconnect method (_messageListenerCompleted.WaitOne()), se comment below.
I'm guessing it hangs because the server (dropbear) disconnected the session before the client (renci.sshnet).
See the following discussion for more information:
[http://sshnet.codeplex.com/discussions/267304](http://sshnet.codeplex.com/discussions/267304)
```
private void Disconnect(DisconnectReason reason, string message)
{
_isDisconnecting = true;
// send disconnect message to the server if the connection is still open
// and the disconnect message has not yet been sent
//
// note that this should also cause the listener thread to be stopped as
// the server should respond by closing the socket
SendDisconnect(reason, message);
// disconnect socket, and dispose it
SocketDisconnectAndDispose();
if (_messageListenerCompleted != null)
{
// at this point, we are sure that the listener thread will stop
// as we've disconnected the socket
_messageListenerCompleted.WaitOne(); // <-- the code hangs here
_messageListenerCompleted.Dispose();
_messageListenerCompleted = null;
}
}
```
Comments: ** Comment from web user: ivanla **
I'm using ssh.net 2014.4.6-beta2
The sshclient hangs in the Disconnect method (_messageListenerCompleted.WaitOne()), se comment below.
I'm guessing it hangs because the server (dropbear) disconnected the session before the client (renci.sshnet).
See the following discussion for more information:
[http://sshnet.codeplex.com/discussions/267304](http://sshnet.codeplex.com/discussions/267304)
```
private void Disconnect(DisconnectReason reason, string message)
{
_isDisconnecting = true;
// send disconnect message to the server if the connection is still open
// and the disconnect message has not yet been sent
//
// note that this should also cause the listener thread to be stopped as
// the server should respond by closing the socket
SendDisconnect(reason, message);
// disconnect socket, and dispose it
SocketDisconnectAndDispose();
if (_messageListenerCompleted != null)
{
// at this point, we are sure that the listener thread will stop
// as we've disconnected the socket
_messageListenerCompleted.WaitOne(); // <-- the code hangs here
_messageListenerCompleted.Dispose();
_messageListenerCompleted = null;
}
}
```
Comments: ** Comment from web user: ivanla **
Should be okay to just comment the following code:
```
if (_messageListenerCompleted != null)
{
// at this point, we are sure that the listener thread will stop
// as we've disconnected the socket
_messageListenerCompleted.WaitOne(); // <-- the code hangs here
_messageListenerCompleted.Dispose();
_messageListenerCompleted = null;
}
```
The MessageListener thread has probably already exited when this hang occurs, and therefore it deadlocks on WaitOne();
Worst case is if the MessageListener thread is running but deadlocked, in that case you will spawn threads that never exit.