public void PipeFrom(IReadable <IMessage> reader) { _fromReader = reader; if (_fromReader.Reader.TryRegisterReaderHandler((msg) => msg.Accept(_msgVisitor), out int id)) { void UnsubscribeFromReader() { _fromReader.Reader.TryUnregisterReaderHandler(id); _fromReader.Dispose(); } // unsubscribe the message handler, then dispose the from reader. _unsubscriber.RegisterSubscription(UnsubscribeFromReader); } }