/// <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)); }
/// <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); } }
/// <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 }); }