in src/Azure.AppService.Tunnel/Tunnel/WebSockets/AsyncWritesProcessor.cs [10:52]
internal class AsyncWritesProcessor(Lifetime lifetime)
{
private readonly ILog _logger = Log.GetLog<AsyncWritesProcessor>();
private readonly AsyncChannel<IOutgoingMessage> _channel = new(lifetime);
public async Task QueueAndAwaitCompletion(IOutgoingMessage outgoingMessage)
{
var request = new CompletableOutgoingMessage(outgoingMessage);
await _channel.SendAsync(request);
await request.TaskCompletionSource.Task;
}
public void Queue(IOutgoingMessage outgoingMessage)
{
_channel.SendBlocking(outgoingMessage);
}
public void BeginProcessing()
{
Task.Run(async () =>
{
while (lifetime.IsAlive)
{
var message = await _channel.ReceiveAsync();
await ExecuteSafe(message);
}
}, lifetime);
}
private async Task ExecuteSafe(IOutgoingMessage outgoingMessage)
{
try
{
await outgoingMessage.Execute();
}
catch (Exception e)
{
if (e is not OperationCanceledException && !outgoingMessage.SilentFailure)
_logger.Error(e);
}
}
}