Blazor Server: NavigationManager在导航到不同页面后停止页面



Blazor,带有"Page1", "Page2", "Page3 "PageX"菜单项。点击"Page1"我使用NavigationManager导航到另一个页面。

一切正常

然而,当我快速点击"Page1","Page2",或任何其他2个或更多页面的组合,我有一个问题,我的Page1加载,但直接另一个页面加载,因为我快速点击菜单项。我的页面包含async/await方法,这里我有问题,例如:

  1. 快速点击"Page3",点击"Page1",点击"Page2">
  2. 导航出现在"page3">
  3. Page3中的异步方法启动(使用async/await/事件附加/…)
  4. 突然导航到"Page1">
  5. Blazor应用程序崩溃,因为例如,一个异步任务返回数据或访问"Page3"组件,该组件已经被处理,因为我们导航到"Page1">
  6. 如果我们很幸运,我们到达了"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()}");
}
}

相关内容

  • 没有找到相关文章

最新更新