【发布时间】:2020-06-20 19:02:53
【问题描述】:
每当收到来自消息队列的消息时,我都会尝试获取要更新的项目列表。
这似乎只在每 other 次收到消息时才起作用。每次都肯定会在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();
}
}
【问题讨论】:
-
您是否尝试添加对 StateHasChanged 的调用?
-
repo里有代码吗,大家可以看看?乍一看,请尝试改用 OnInitializedAsync 方法。
-
嗯,这里只是一个想法。我看到您正在使用异步代码,通过在 Microsoft 的文档中进行一些搜索,我发现了以下内容:docs.microsoft.com/en-us/aspnet/core/blazor/… 这表示预呈现其内容的 Blazor Server 应用程序调用 OnInitializedAsync 两次,一次是在组件最初静态呈现为浏览器与服务器建立连接时的第二次页面。给它看一眼,如果你发现了什么,就回信。
-
@vasilisdmr 就是这样! :) 当
firstRender参数为真时,我已切换到使用OnAfterRenderAsync事件,这可以按预期工作。如果您将此作为答案,我可以将其标记为正确答案。谢谢:) -
很高兴听到这个消息!很高兴我们找到了解决方案!我将其添加为答案。 @丹
标签: c# asp.net-core blazor blazor-server-side