InteractiveServer .net 8 为什么我必须使用“await Task.Delay(1);”渲染页面加载?

问题描述 投票:0回答:1

这是我页面上的代码:

protected override async Task OnInitializedAsync()
{
    await Task.Delay(1);
    Criterias = new ParcoursCriterias()
    {
        PageNumber = pageNumber,
        ElementsByPage = 10
    };
    ParcoursList = await ParcoursService.GetAll(Criterias);
}

这是来自 App.razor 的代码:

    @if(RenderModeForPage is not null)
    {
        <HeadOutlet @rendermode="@RenderModeForPage" />    
    }
    else
    {
        <HeadOutlet />
    }
</head>

<body>
    @if(RenderModeForPage is not null)
    {
        <Routes @rendermode="@RenderModeForPage" />
    }
    else
    {
        <Routes />
    }
    <script src="_framework/blazor.web.js"></script>
    <script src="_content/MudBlazor/MudBlazor.min.js"></script>
</body>

</html>

@code {
    [CascadingParameter]
    private HttpContext HttpContext { get; set; } = default!;

    private IComponentRenderMode? RenderModeForPage => HttpContext.Request.Path.StartsWithSegments("/Account")
        ? null
        : InteractiveServer;
}

当我使用“await Task.Delay(1);”时,我可以导航到我的页面,而不必等到加载完成才能导航到页面生效。因此,当我将延迟放在页面上并单击按钮导航到它时,它会导航到正确的页面,我可以在上面看到加载程序。但是,就像我说的,当我不设置延迟并单击另一个页面导航到我的页面时,应用程序会等到加载完成然后导航。这真是令人沮丧。

所以我的问题是:我对 OnInitializedAsync 的延迟做了正确的事情吗?我该怎么做才能使其正常工作?

谢谢你。

c# .net blazor rendering render
1个回答
0
投票

如果我没看错的话,您的问题是您希望能够在页面显示的数据仍在加载时单击页面上的导航按钮。 实现这一目标的唯一方法是使用

await Task.Delay(1)

在您的

OnInitializedAsync
中,这行:

    ParcoursList = await ParcoursService.GetAll(Criterias);

应该产生 [因此不应该有 Task.Delay 的理由]。

但是,显然不是,所以

ParcoursService.GetAll(Criterias)
是一个包含在
Task
中的同步代码块,在完成之前不会产生。

您需要显示

ParcoursService.GetAll(Criterias)
的内容以及它调用的异步数据管道的类型,以进行进一步分析。

© www.soinside.com 2019 - 2024. All rights reserved.