c# - 从另一个线程更新 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();
}
}
解决方案
从微软的文档中,我看到了这篇文章: 组件初始化方法
它说:
预呈现其内容的 Blazor Server 应用调用 OnInitializedAsync 两次
当组件最初作为页面的一部分静态呈现时。
第二次,当浏览器与服务器建立连接时。
所以,我想如果你使用OnAfterRenderAsync并将第一个参数设置为 true 将解决你的问题
推荐阅读
- javascript - VueJS单元测试“要测试什么”,属性的内容?
- php - 编译器 psr-4 自动加载
- javascript - 如果JS中存在值,如何根据日期按降序对数组进行排序?
- python - 在 Visual Studio 中使用 Kivy:找不到任何有价值的 Window 提供程序
- python-3.x - driver.find_element_by_xpath 没有在 selenium python 中单击我的元素
- python - 我可以返回一个操作作为带有 if...else 条件的 lambda 函数的输出吗?
- java - 如何在 java main 方法中添加 testng 参数?
- php - ZipArchive :: close() 在 CentOS 中不起作用
- laravel - Eloquent:基于一对多关系查找表的所有记录
- multidimensional-array - 我有一些问题,每个问题都包含不同的类型。如何在多维数组中查找重复值?