// returns false if the max pending messages total size was hit. internal bool EnqueueMessage(Message message, int messageBufferSize, Action messageDequeuedCallback) { Action onMessageDequeuedCallback = () => { lock (this.ThisLock) { this.pendingMessagesTotalSize -= messageBufferSize; Fx.Assert(this.pendingMessagesTotalSize >= 0, "pendingMessagesTotalSize should not be negative."); } messageDequeuedCallback(); }; bool success = false; lock (this.ThisLock) { if (this.pendingMessagesTotalSize + messageBufferSize <= this.maxPendingMessagesTotalSize) { message.Properties.Via = this.Via; this.pendingMessagesTotalSize += messageBufferSize; try { this.FinishEnqueueMessage(message, onMessageDequeuedCallback, false); success = true; } finally { if (!success) { this.pendingMessagesTotalSize -= messageBufferSize; } } } else { if (TD.MaxPendingMessagesTotalSizeReachedIsEnabled()) { string messageIdString = string.Empty; if (message.Headers.MessageId != null) { messageIdString = string.Format(CultureInfo.CurrentCulture, "'{0}' ", message.Headers.MessageId.ToString()); } EventTraceActivity eventTraceActivity = EventTraceActivityHelper.TryExtractActivity(message); TD.MaxPendingMessagesTotalSizeReached(eventTraceActivity, messageIdString, this.maxPendingMessagesTotalSize, typeof(TransportBindingElement).FullName); } } } return(success); }