【发布时间】:2023-04-03 22:17:01
【问题描述】:
---更新---
我现在可以说,每次计时器无法触发时,我都会在调试输出中收到以下错误消息。当我收到错误时,计时器 100% 的时间都失败了。
Failed to load resource: net::ERR_HTTP2_PROTOCOL_ERROR [https://localhost:44371/_framework/blazor.server.js] Exception thrown: 'Microsoft.AspNetCore.Connections.ConnectionResetException' in Microsoft.AspNetCore.Server.IIS.dll
但是,live site(在 Windows 服务器上)有时也无法触发 Timer,所以我认为这不仅仅是 VS 调试问题。
---/更新---
我的门厅页面上有一个持续 3 秒的动画 svg。我想在 3 秒后显示其他控件:登录按钮、“参观”等等,所以我添加了一个在 OnAfterRender 中启动的 Timer(也尝试过 OnAfterRenderAsync)。
问题是大约有 1/3 的时间(随机地很少为 1/20 或更多),计时器的处理程序没有触发,并且控件没有显示。我假设这是某种线程竞争条件,但我真的不明白可以做些什么。
我试过了:
- 使用
async生命周期事件和处理程序 -
await ()=>表达式等各种组合
(注意——我知道我可以使用动画 CSS 来做到这一点,但我现在限制测试计时器的使用)
下面是一些简化的代码:
<MyCoolAnimation / >
@if (ShowControls)
{
// various controls
}
@code {
bool ShowControls;
protected override void OnAfterRender(bool firstRender)
{
if (!firstRender)
{
Timer = new Timer(3000);
Timer.Elapsed += CountDownTimer;
Timer.Start();
}
}
private async void CountDownTimer(Object source, System.Timers.ElapsedEventArgs e)
{
Timer.Stop();
Timer.Dispose();
ShowControls = true;
await InvokeAsync(StateHasChanged);
}
}
【问题讨论】:
-
请阅读How to Ask,然后阅读minimal reproducible example。然后,请向我们提供您尝试过的各种操作的完整代码以及我们复制您的问题的说明。现在您的问题似乎没有包含足够的信息让我们给您一个好的答案。一个好的问题可以在几分钟内得到答案。
-
该指令将您想要的任何内容放入 @if 块中,然后重新加载大约 20 次,也许是 30 次。我无法给出比这更小的可重现示例。我也无法列出我尝试使用
async Tasks或生命周期覆盖来找到任何不同的许多方法,因为我已经尝试了很多方法,但结果没有明显的变化。 -
“我不能给出一个比这更小的可重现的例子。” - 你当然可以。如果我只是创建一个 Blazor 应用程序并粘贴到您的代码中,它甚至不会为我运行。请创建一个示例应用程序来演示您的问题,并向我们提供运行该应用程序的说明。这应该不难做到。
-
我使用来自服务的类似心跳的事件。整个应用程序的 1 个计时器。委托传递计数或当前日期时间。无论哪种方式,您都可以使用它来计算持续时间。
-
Blazor 服务器还是 WebAssembly? Timer 如何/在哪里声明?您离minimal reproducible example 很近,但只是不在那里。