public Worker(IMessageVisitorFactory msgVisitorFactory, Func <TIn, TOut> funWork, Func <ISharedPipe <IMessage> > pipeFactory, bool shouldStopOnError) { _funWork = funWork; _msgVisitor = msgVisitorFactory.Create(this); OnEndOfStream += OnEndOfStreamHandler; (_toReader, _writer) = pipeFactory().GetReaderWriterCouple(); // Dispose handler _unsubscriber = new Unsubscriber(); // unsubscribe the event on dispose _unsubscriber.RegisterSubscription(() => OnEndOfStream -= OnEndOfStreamHandler); }
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); } }