internal ValueTask WriteDirectOrQueueFireAndForgetAsync <T>(PhysicalConnection connection, Message message, ResultProcessor <T> processor)
        {
            async ValueTask Awaited(ValueTask <WriteResult> l_result) => await l_result.ForAwait();

            if (message != null)
            {
                message.SetSource(processor, null);
                ValueTask <WriteResult> result;
                if (connection == null)
                {
                    Multiplexer.Trace("Enqueue: " + message);
                    result = GetBridge(message.Command).TryWriteAsync(message, isSlave);
                }
                else
                {
                    Multiplexer.Trace("Writing direct: " + message);
                    var bridge = connection.BridgeCouldBeNull;
                    if (bridge == null)
                    {
                        throw new ObjectDisposedException(connection.ToString());
                    }
                    else
                    {
                        result = bridge.WriteMessageTakingWriteLockAsync(connection, message);
                    }
                }

                if (!result.IsCompletedSuccessfully)
                {
                    return(Awaited(result));
                }
            }
            return(default);
 internal void WriteDirectOrQueueFireAndForget <T>(PhysicalConnection connection, Message message, ResultProcessor <T> processor)
 {
     if (message != null)
     {
         message.SetSource(processor, null);
         if (connection == null)
         {
             Multiplexer.Trace("Enqueue: " + message);
             GetBridge(message.Command).TryWrite(message, isSlave);
         }
         else
         {
             Multiplexer.Trace("Writing direct: " + message);
             var bridge = connection.BridgeCouldBeNull;
             if (bridge == null)
             {
                 throw new ObjectDisposedException(connection.ToString());
             }
             else
             {
                 bridge.WriteMessageTakingWriteLock(connection, message);
             }
         }
     }
 }
示例#3
0
 internal void OnConnectionFailed(PhysicalConnection connection, ConnectionFailureType failureType, Exception innerException)
 {
     Trace($"OnConnectionFailed: {connection}");
     AbandonPendingBacklog(innerException);
     if (reportNextFailure)
     {
         LastException     = innerException;
         reportNextFailure = false; // until it is restored
         var endpoint = ServerEndPoint.EndPoint;
         Multiplexer.OnConnectionFailed(endpoint, ConnectionType, failureType, innerException, reconfigureNextFailure, connection?.ToString());
     }
 }
 internal void OnFullyEstablished(PhysicalConnection connection)
 {
     try
     {
         if (connection == null)
         {
             return;
         }
         var bridge = connection.BridgeCouldBeNull;
         if (bridge != null)
         {
             if (bridge == subscription)
             {
                 Multiplexer.ResendSubscriptions(this);
             }
             Multiplexer.OnConnectionRestored(EndPoint, bridge.ConnectionType, connection?.ToString());
         }
     }
     catch (Exception ex)
     {
         connection.RecordConnectionFailed(ConnectionFailureType.InternalFailure, ex);
     }
 }