private void WaitToSendMessage(WaitingSender <TMessage> waitingSender, Func <Semaphore, bool> waitFunction, Exception failureException) { try { var messageSent = waitFunction(waitingSender.WaitSemaphore); if (messageSent) { return; } Lock(); if (!waitingSender.MessageSent) { waitingSenders.Remove(waitingSender); Unlock(); throw failureException; } // else the message has actually been sent (a moment later) Unlock(); } catch { Lock(); if (!waitingSender.MessageSent) { waitingSenders.Remove(waitingSender); } Unlock(); throw; } }
private void Send(TMessage message, Func <Semaphore, bool> waitFunction, Exception failureException) { Lock(); if (ConnectedOutlet != null) { Unlock(); throw new InvalidOperationException("You cannot send through a connected inlet."); } if (!HasWaitingSender()) { var receiver = Pipe.FindReceiver(this); if (receiver != null) { receiver(message); Unlock(); return; } } var waitingSender = new WaitingSender <TMessage>(message); waitingSenders.Add(waitingSender); Unlock(); WaitToSendMessage(waitingSender, waitFunction, failureException); }