Esempio n. 1
0
 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;
     }
 }
Esempio n. 2
0
        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);
        }