Blazor,带有"Page1", "Page2", "Page3 "PageX"菜单项。点击"Page1"我使用NavigationManager导航到另一个页面。
一切正常
然而,当我快速点击"Page1","Page2",或任何其他2个或更多页面的组合,我有一个问题,我的Page1加载,但直接另一个页面加载,因为我快速点击菜单项。我的页面包含async/await方法,这里我有问题,例如:
- 快速点击"Page3",点击"Page1",点击"Page2">
- 导航出现在"page3">
- Page3中的异步方法启动(使用async/await/事件附加/…)
- 突然导航到"Page1">
- Blazor应用程序崩溃,因为例如,一个异步任务返回数据或访问"Page3"组件,该组件已经被处理,因为我们导航到"Page1">
- 如果我们很幸运,我们到达了"Page1",但同样可能发生,因为导航到"Page2"发生直接
当导航出现时,是否有办法"取消"导航?导航到另一个页面时当前页面?(例如,也许类似于CancellationToken ?)
- 怎么说"看起来像吗?
- 你在页面异步做什么?
- 您是否在页面/组件中进行直接DB访问?
Blazor App不应该崩溃。所有的页面都是组件,其生命周期由Renderer
管理。它们可能在完成渲染之前从RenderTree中删除,但是Renderer仍然会在放弃对它们的引用之前等待它们的事件周期的完成:它们将完成它们的事件周期。
这里有一个演示计数器,你可以快速点击thro,看看会发生什么。当组件从RenderTree中移除时,Dispose会被调用生命周期仍然完成。
@page "/counter"
@using System.Diagnostics
@implements IDisposable
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
<div>
Message: @message
</div>
@code {
private int currentCount = 0;
private string message = string.Empty;
private void IncrementCount()
{
currentCount++;
}
protected async override Task OnInitializedAsync()
{
Debug.WriteLine($"Started Load at {DateTime.Now.ToLongTimeString()}");
message = "Loading";
await Task.Delay(10000);
message = "Loaded";
Debug.WriteLine($"Finished Load at {DateTime.Now.ToLongTimeString()}");
}
public void Dispose()
{
Debug.WriteLine($"Disposed at {DateTime.Now.ToLongTimeString()}");
}
}