diff --git a/tests/IgniteUI.Blazor.Lite.TestBed/Components/Pages/Home.razor b/tests/IgniteUI.Blazor.Lite.TestBed/Components/Pages/Home.razor index 2a20eade..b9fdfb7b 100644 --- a/tests/IgniteUI.Blazor.Lite.TestBed/Components/Pages/Home.razor +++ b/tests/IgniteUI.Blazor.Lite.TestBed/Components/Pages/Home.razor @@ -26,6 +26,7 @@ private Dictionary componentParameters = new(); private List errorMessages = new List(); private string eventMessage = string.Empty; + private TaskCompletionSource? pendingRender; private IConfigurationRoot config; @@ -40,6 +41,10 @@ protected override async Task OnAfterRenderAsync(bool firstRender) { + var renderTcs = this.pendingRender; + this.pendingRender = null; + renderTcs?.TrySetResult(true); + if (firstRender) { await JS.InvokeVoidAsync("onAfterRender"); @@ -300,8 +305,7 @@ } // set prop and wait for state to change parameters.Add(p.Name, value!); - StateHasChanged(); - await Task.Delay(1); + await WaitForRenderAsync(p.Name); var clientPropName = ReflectionUtils.GetActualPropertyName(p); var clientValue = await GetClientPropValue(clientPropName); @@ -316,6 +320,31 @@ } } + private async Task WaitForRenderAsync(string propName, int timeoutMs = 1000) + { + var renderTcs = this.pendingRender; + if (renderTcs == null || renderTcs.Task.IsCompleted) + { + renderTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + this.pendingRender = renderTcs; + } + + // trigger StateHasChanged to request a render. + await InvokeAsync(StateHasChanged); + + // when render task finishes in OnAfterRenderAsync (or on timeout) continue. + var completed = await Task.WhenAny(renderTcs.Task, Task.Delay(timeoutMs)); + if (completed != renderTcs.Task) + { + if (ReferenceEquals(this.pendingRender, renderTcs)) + { + this.pendingRender = null; + } + + this.errorMessages.Add("Timed out waiting for component render after setting property: " + propName); + } + } + // in cases of slower operations, connection closes and execution stops, hence adding a try catch with a 5 second timeout and retry if needed. public async Task GetClientPropValue(string propName, int retry = 1) {