【问题标题】:About page updates on Blazor Server关于 Blazor 服务器上的页面更新
【发布时间】:2021-09-21 13:33:48
【问题描述】:

很抱歉,这个非常初级的问题。

我正在为 Blazor Server 上的生产设备编写一个简单的管理应用程序。 我想在 Blazor 页面上查看该数据,因为完成的件数每秒从生产设备更新到数据库。

具体来说,我想在数据库刷新后或每隔几秒(例如,每 10 秒)刷新一次页面。

但是,我不知道如何制作其中任何一个。 应该如何考虑和实施?

对于这个非常抽象的问题,我很抱歉,但我想要一些建议。谢谢。

【问题讨论】:

  • 非常感谢。这是很不错的内容。在从 UI 进行操作(例如添加)之后,此内容似乎正在使用 DbService.GetAllData () 重新获取数据。这次我要做的是没有来自 UI 的特定操作,我想引用从应用程序以外的位置不断更新的数据库并显示值。如果 UI 中的操作不能作为起点,我应该如何重新获取数据?
  • 仅供参考,很难为您的原始问题提供准确的答案,因为您没有针对您的特定问题提供任何示例代码。但是,数据库更新后,可以调用StateHasChanged 方法来刷新页面/UI。调用时,这将根据数据库中的新更改重新呈现组件或页面。虽然这个link 不是您要找的,但接受的答案确实显示了使用StateHasChanged 的示例
  • 了解您已经尝试过的内容以及遇到的确切问题将非常有用。如果您还没有阅读,请考虑阅读minimal reproducible example
  • 你需要a Timer

标签: blazor blazor-server-side


【解决方案1】:

因此,除非您的数据库发布了您的应用可以侦听的事件,否则您将需要在设定的时间间隔内查询数据库。

此解决方案也适合您的情况:Blazor Timer call async API task to update UI

基本上你会设置一个计时器。这是微软的通用文档:https://docs.microsoft.com/en-us/dotnet/api/system.threading.timer?view=net-5.0

这看起来实际上是当组件初始化时,您将放置您的代码。

我个人在@code 部分有以下内容:

private System.Timers.Timer DelayTimer;

async void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    await CheckForNotifications();
}

async Task CheckForNotifications()
{
    // Your Code goes here.
    StateHasChanged();
}

protected override async Task OnInitializedAsync()
{
    _log.Information("Component is Initialized.");
    await CheckForNotifications();

    DelayTimer = new System.Timers.Timer((double)(60 * 1000 * 3)); // 60 seconds * 3 is 3 minutes.
    DelayTimer.Elapsed += timer_Elapsed;
    DelayTimer.AutoReset = true;
    DelayTimer.Start();
    _log.Debug("Timer Started.");

}

【讨论】:

  • 你真的需要 Dispose() 定时器。并在某处调用 StateHasChanged()。
  • 我真的很抱歉这么晚才回复。谢谢你非常礼貌的解释。参考链接对我有用。让我看看你教我什么。使用 Timer 以指定的感觉执行方法。在这个Timer中,执行StateHasChanged()会重新渲染页面并调用OnInitialized()。因此,通过在OnInitialized()中描述从数据库中获取完成数据个数的过程,也就是我想做的,应该可以定期获取数据。这种理解正确吗?
  • 是的,我从我的一个项目中复制了代码。在“你的代码在这里”中,我确实有“StateHasChanged”方法。我将它添加到上面的代码中。就 Dispose 而言,当您重置计时器时,Microsoft 的文档似乎不需要它:docs.microsoft.com/en-us/dotnet/api/…docs.microsoft.com/en-us/dotnet/api/…
  • @BTOM StateHasChanged 不会导致它重新初始化,而是重新渲染 (docs.microsoft.com/en-us/aspnet/core/blazor/components/…) 。所以你的定时器可以在 OnInitialized 方法中设置。在您的 time_Elapsed 方法上,您可以为您的数据调用一个方法。我的“CheckForNotifications”方法就是它的“容器”。
  • 抱歉回复晚了。我试着照原样模仿链接,看看能不能显示时间。 Blazor Timer call async API task to update UI 在我得到这个代码:上面链接的一部分我在 StateHasChanged() 中得到以下错误;部分。 System.ObjectDisposedException:'在释放渲染器后无法处理挂起的渲染。 ObjectDisposed_ObjectName_Name' 搜索类似的示例并不能告诉我是什么原因造成的。这有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2020-03-02
  • 2021-06-08
相关资源
最近更新 更多