protected void Dispose(bool disposing) { if (disposing) { GC.SuppressFinalize(this); _serializer.Dispose(); _formatter.Dispose(); _decoder.Dispose(); _stream.Dispose(); // can't dispose a socket for some reason, so this should handle it using (_socket) _socket.Shutdown(SocketShutdown.Both); } else { Action <PeerConnection> disposeCallback = _disposeCallback; if (disposeCallback != null) { disposeCallback(this); } } }