Asynchronous chat processing in an instance

This commit is contained in:
Jordan Brown
2021-08-26 19:13:35 -04:00
parent a18700c077
commit f3e3327828
@@ -752,6 +752,7 @@ namespace Tgstation.Server.Host.Components.Chat
{
logger.LogTrace("Starting processing loop...");
var messageTasks = new Dictionary<IProvider, Task<Message>>();
Task activeProcessingTask = Task.CompletedTask;
try
{
Task updatedTask = null;
@@ -785,8 +786,17 @@ namespace Tgstation.Server.Host.Components.Chat
{
var message = await completedMessageTaskKvp.Value.ConfigureAwait(false);
var messageNumber = Interlocked.Increment(ref messagesProcessed);
using (LogContext.PushProperty("ChatMessage", messageNumber))
async Task WrapProcessMessage()
{
var localActiveProcessingTask = activeProcessingTask;
await ProcessMessage(completedMessageTaskKvp.Key, message, cancellationToken).ConfigureAwait(false);
await localActiveProcessingTask.ConfigureAwait(false);
}
using (LogContext.PushProperty("ChatMessage", messageNumber))
activeProcessingTask = WrapProcessMessage();
messageTasks.Remove(completedMessageTaskKvp.Key);
}
}
@@ -799,6 +809,10 @@ namespace Tgstation.Server.Host.Components.Chat
{
logger.LogError(e, "Message loop crashed!");
}
finally
{
await activeProcessingTask.ConfigureAwait(false);
}
logger.LogTrace("Leaving message processing loop");
}