【发布时间】:2021-10-02 15:22:41
【问题描述】:
我编写了一个使用 Blazor 服务器应用定期更新页面的程序。
该程序执行时,每秒获取当前时间和数据库表中的值并显示在页面上,但该定时器中的处理在一定时间后停止。
虽然没有准确测量,但计时器中的处理会在大约 10 到 30 分钟后停止。
但是,当我查看浏览器的调试工具时,没有错误,在visual studio上也没有错误。
我搜索了一个这样的例子,但找不到它,也无法确定是什么原因造成的。
我希望此计时器中的处理工作,直到我明确指定它停止。
这可能是什么原因? 我有麻烦,因为我不知道原因。 请给我一些建议。 谢谢。
private string Time { get; set; }
protected override void OnInitialized()
{
var timer = new System.Threading.Timer((_) =>
{
Time = DateTime.Now.ToString();
InvokeAsync(() =>
{
// Get the value from the database
databaseValue = TimerProcessGetValue();
StateHasChanged();
});
}, null, 0, 1000);
base.OnInitialized();
}
定时器中调用的进程
public async Task<int?> TimerProcessGetValue()
{
int? timerProcessValue;
using(DbContext = DbFactory.CreateDbContext())
{
timerProcessValue = dbContext.TestTable.Single(x => x.Id == 1).TestValue;
}
return timerProcessValue;
}
后记
目标组件的全文。
PageRefleshTest.cs
@page "/refresh-ui-manually"
@using System.Threading;
@using TestBlazorServer.Models;
@using Microsoft.EntityFrameworkCore;
@inject IDbContextFactory<SQLbeginnerContext> DbFactory
<h1>@Time</h1>
<h1>TestValue:@databaseValue</h1>
private string Time { get; set; }
private int? databaseValue { get; set; }
protected override void OnInitialized()
{
var timer = new System.Threading.Timer((_) =>
{
Time = DateTime.Now.ToString();
InvokeAsync(() =>
{
// Get the value from the database
databaseValue = TimerProcessGetValue().Result;
StateHasChanged();
});
}, null, 0, 1000);
base.OnInitialized();
}
public async Task<int?> TimerProcessGetValue()
{
int? timerProcessValue;
using (var dbContext = DbFactory.CreateDbContext())
{
timerProcessValue = dbContext.TestTable.Single(x => x.Id == 1).TestValue;
}
return timerProcessValue;
}
使用 System.Timers.Timer 实现
@page "/Refresh2"
@inject IDbContextFactory<SQLbeginnerContext> DbFactory
@using TestBlazorServer.Models
@using Microsoft.EntityFrameworkCore
@using System.Timers
@implements IDisposable
<h3>PageRefresh2</h3>
<h1>@Time</h1>
<h1>@currentCount</h1>
<h1>TestValue:@databaseValue/h1>
@code {
private int currentCount = 0;
private Timer timer2 = new(1000);
private string Time { get; set; }
private int? databaseValue { get; set; }
protected override void OnInitialized()
{
timer2.Elapsed += (sender, eventArgs) => OnTimerCallback();
timer2.Start();
}
private void OnTimerCallback()
{
_ = InvokeAsync(() =>
{
currentCount++;
Time = DateTime.Now.ToString();
databaseValue = TimerProcessGetValue().Result;
StateHasChanged();
});
}
public void Dispose() => timer2.Dispose();
public async Task<int?> TimerProcessGetValue()
{
int? timerProcessValue;
await using (var dbContext = DbFactory.CreateDbContext())
{
timerProcessValue = dbContext.TestTable.Single(x => x.Id == 1).TestValue;
}
return timerProcessValue;
}
}
【问题讨论】:
-
你能说明
databaseValue是如何定义的以及它是如何在组件中使用的吗? -
不应该是 async () => { databaseValue = await TimerProcessGetValue(); }
-
10 到 30 分钟可能足以让信号器连接发生某些事情。我不确定我是否会进行任何编程,以便保持连接到服务器的浏览器对某些人来说至关重要进程成功
-
感谢您的 cmets。列出了目标组件的所有部分。这很简单,所以似乎没有问题......这是由于SignalR的行为,而不是程序?对不起,我不成熟,不太了解 SignalR。
标签: c# .net-core blazor blazor-server-side