public PendingReceive Receive(SelectiveConsumer <T> consumer) { if (ReceiveWaitingMessage(consumer)) { return(null); } var pending = new PendingReceiveImpl <T>(consumer, x => _receivers.Remove(x)); _receivers.Add(pending); return(pending); }
public PendingReceive Receive(SelectiveConsumer <T> consumer, TimeSpan timeout, Action timeoutCallback) { if (ReceiveWaitingMessage(consumer)) { return(null); } var pending = new PendingReceiveImpl <T>(consumer, timeoutCallback, x => _receivers.Remove(x)); pending.ScheduleTimeout(x => _scheduler.Schedule(timeout, _fiber, x.Timeout)); _receivers.Add(pending); return(pending); }
bool DeliverToWaitingReceiver(T message) { for (int i = 0; i < _receivers.Count; i++) { PendingReceiveImpl <T> receiver = _receivers[i]; Consumer <T> consumer = receiver.Accept(message); if (consumer == null) { continue; } consumer(message); return(true); } return(false); }