diff --git a/src/Aspire.Dashboard/Components/Controls/LogViewer.razor b/src/Aspire.Dashboard/Components/Controls/LogViewer.razor index ad80bd9156d..692dc50ab1d 100644 --- a/src/Aspire.Dashboard/Components/Controls/LogViewer.razor +++ b/src/Aspire.Dashboard/Components/Controls/LogViewer.razor @@ -14,7 +14,10 @@ [Parameter] public string InitialText { get; set; } = ""; + private List> _preRenderQueue = new(); + bool initialMessageCleared = false; + bool renderComplete = false; private IJSObjectReference? _jsModule; @@ -22,6 +25,7 @@ { if (_jsModule is not null) { + initialMessageCleared = true; await _jsModule.InvokeVoidAsync("clearLogs"); } } @@ -32,17 +36,41 @@ internal Task AddLogEntriesAsync(IEnumerable logEntries) => WriteLogsAsync(logEntries); + private ValueTask WriteLogsToDom(IEnumerable logs) + => _jsModule is null ? ValueTask.CompletedTask : _jsModule.InvokeVoidAsync("addLogEntries", logs); + protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { _jsModule ??= await JS.InvokeAsync("import", "/_content/Aspire.Dashboard/Components/Controls/LogViewer.razor.js"); + + if (_preRenderQueue.Count > 0) + { + await WritePreRenderQueue(); + } + renderComplete = true; + } + + async Task WritePreRenderQueue() + { + if (!initialMessageCleared) + { + initialMessageCleared = true; + await ClearLogsAsync(); + } + + foreach (var logs in _preRenderQueue) + { + await WriteLogsToDom(logs); + } + _preRenderQueue.Clear(); } } private async Task WriteLogsAsync(IEnumerable logs) { - if (_jsModule is not null) + if (renderComplete) { if (!initialMessageCleared) { @@ -50,7 +78,11 @@ await ClearLogsAsync(); } - await _jsModule.InvokeVoidAsync("addLogEntries", logs); + await WriteLogsToDom(logs); + } + else + { + _preRenderQueue.Add(logs); } }