示例#1
0
        /// <summary>
        /// Writes the message and waits for the actual result. Slower than WriteAsync
        /// </summary>
        public async ValueTask <MessageWriteResult> WriteAndWaitAsync(T message)
        {
            var writer       = writeChannel.Writer;
            var tcs          = new TaskCompletionSource <MessageWriteResult>();
            var writeRequest = new MessageWriteRequest(message, tcs);

            bool writeable = false;

            while (writeable = await writer.WaitToWriteAsync().ConfigureAwait(false))
            {
                if (writer.TryWrite(writeRequest))
                {
                    break;
                }
            }

            if (!writeable)
            {
                return(new MessageWriteResult
                {
                    IsCompleted = true,
                    Error = false,
                    Exception = null
                });
            }

            return(await tcs.Task.ConfigureAwait(false));
        }
示例#2
0
        /// <inheritdoc/>
        public override void MessageSent(INextFilter nextFilter, IoSession session, IWriteRequest writeRequest)
        {
            if (writeRequest is EncodedWriteRequest)
            {
                return;
            }

            MessageWriteRequest wrappedRequest = writeRequest as MessageWriteRequest;

            if (wrappedRequest != null)
            {
                nextFilter.MessageSent(session, wrappedRequest.InnerRequest);
            }
            else
            {
                nextFilter.MessageSent(session, writeRequest);
            }
        }
示例#3
0
        /// <summary>
        /// NOTE: All writes will be reported as success because messages are dropped
        /// into a queue that are written later. If you would like to wait for an actual result on the write,
        /// use WriteAndWaitAsync
        /// </summary>
        public async override ValueTask <MessageWriteResult> WriteAsync(T message)
        {
            var writer       = writeChannel.Writer;
            var writeRequest = new MessageWriteRequest(message);

            bool writeable = false;

            while (writeable = await writer.WaitToWriteAsync().ConfigureAwait(false))
            {
                if (writer.TryWrite(writeRequest))
                {
                    break;
                }
            }

            return(new MessageWriteResult
            {
                IsCompleted = !writeable,
                Error = false,
                Exception = null
            });
        }