首页 > 解决方案 > 从另一个线程更新 Blazor 中的项目列表

问题描述

每当从消息队列中收到消息时,我都会尝试获取要更新的项目列表。

不过,这似乎只在每隔一次收到消息时才有效。每次肯定都会在SubscribeAsync调用中遇到匿名方法,我无法弄清楚为什么它每次都不更新。我假设它与位于不同线程中的匿名方法有关。任何想法我做错了什么?

@page "/"
@inject IMessageQueueHelperFactory MessageQueueHelperFactory
@inject ILogger<Index> Logger
@using Microsoft.Extensions.Logging
@using Newtonsoft.Json

<ul class="list-group">
    @foreach (var user in Users) {
        <li class="list-group-item">@user</li>
    }
</ul>

@code
{
    private List<string> Users { get; set; } = new List<string>();

    protected override void OnInitialized()
    {
        MessageQueueHelperFactory.Create(Queues.UserRegistration)
            .SubscribeAsync(async x =>
            {
                var user = JsonConvert.DeserializeObject<UserRegistrationData>(x);
                Users.Add(user.Username);
                await InvokeAsync(StateHasChanged);
            });

        base.OnInitialized();
    }
}

标签: c#asp.net-coreblazorblazor-server-side

解决方案


从微软的文档中,我看到了这篇文章: 组件初始化方法

它说:

预呈现其内容的 Blazor Server 应用调用 OnInitializedAsync 两次

  • 当组件最初作为页面的一部分静态呈现时。

  • 第二次,当浏览器与服务器建立连接时。

所以,我想如果你使用OnAfterRenderAsync并将第一个参数设置为 true 将解决你的问题


推荐阅读