在 Blazor 中显示计时器

2024-04-29

我正在尝试在服务器端 Blazor 应用程序中显示倒计时器。我的代码同时使用 F# 和 C# 语言。该代码在某种程度上可以工作,但计时器永远不会按预期停止,并且计时器显示偶尔不会呈现所有数字。这是我第一次尝试 Blazor 服务器端应用程序。我不确定问题是异步问题、计时器问题还是渲染问题。

这是我的代码:

F#

let private setTimer countDown timeEvent =

    let timer = new Timer(float countDown * float 1000)
    let mutable time = 0

    time <- countDown

    timer.Elapsed.Add(fun arg ->
        time <- time - 1
        if time = 0
        then 
            timer.Stop()
            timer.Dispose()
        else
            ()
        timeEvent arg
    )

    timer.AutoReset <- true
    timer.Start()

let setTimerAsync countDown timeEvent = async{
    setTimer countDown timeEvent
    do! Async.Sleep (countDown * 1000)
}

type Timer (countDown) =

    member val CountDown : int = countDown with get,set

    member this.SetTimeAsTask (timeEvent) =
        setTimerAsync countDown timeEvent |> Async.StartAsTask

C#/Blazor

@page "/CountDown"
@using System.Timers
@using ClientTImer
@using Microsoft.FSharp.Core

<h3>Count Down</h3>
<p>
    Task: @task <br />
    Status: @status
</p>
<p>
    Timer: @time
</p>

@code {
    string task = "";
    string status = "";
    int time = 5;

    protected override async Task OnInitializedAsync()
    {

        // Initial task and status
        task = "First Task";
        status = "Status One";

        Action<System.Timers.ElapsedEventArgs> timeEvent =
            t =>
            {
                UpdateTime().Wait();
            };

        var func = FuncConvert.ToFSharpFunc(timeEvent);

        await new ClientTImer.Timer(time).SetTimeAsTask(func);

        // Update task and status
        task = "Second Task";
        status = "Status Two";
        await new ClientTImer.Timer(time).SetTimeAsTask(func);

        // Update task and status
        task = "Third Task";
        status = "Status Three";

    }

    public async Task UpdateTime()
    {
        await InvokeAsync(() =>
        {
            time--;
            StateHasChanged();
        });
    }

}

在你的 F# 里面Timer.Elapsed事件处理程序,你的最后一行是timeEvent(没有参数),我从你的代码的其余部分看到timeEvent is an Action已转换为 F# 函数。由于你之后没有写任何参数timeEvent,该行的作用是指定value of timeEvent作为事件处理程序的返回值,即您的事件处理程序正在返回一个函数。或者它would如果事件处理程序返回除以下内容之外的其他内容,则返回一个函数void (or unit以 F# 术语表示)。因为他们没有,我怀疑你已经收到了警告timeEvent说明了以下内容的值的行timeEvent本质上被忽视。

另外,你的timer.Elapsed.AddF# 中的行对我来说看起来不对。这Add事件方法采用类型参数'T -> unit, where 'T是事件为您提供的任何类型的数据:Elapsed定时器上的事件,那将是ElapsedEventArgs实例。你应该传递给什么Add is a fun elapsedEventArgs -> ...。然后你会改变你的timeEvent行实际传递一个参数(那些相同的elapsedEventArgs)以便它被调用并实际执行某些操作。

另外,每当你递减一个数字并将其与 0 进行比较时,我总是喜欢进行比较<=而不是=,只是万一我稍后更改代码可能会导致递减发生两次。如果我的比较是= 0双减法将数字从 1 减到 -1,if x = 0分支不会触发。但如果我比较<= 0,那么即使我在其他地方犯了错误,它也会触发。所以我建议写if time <= 0而不是if time = 0.

换句话说,我认为你的timer.Elapsed事件处理程序需要如下所示:

timer.Elapsed.Add(fun evtArgs ->
    time <- time - 1
    if time <= 0
    then 
        timer.Stop()
        timer.Dispose()
    else
        ()
    timeEvent evtArgs
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Blazor 中显示计时器 的相关文章

随机推荐

  • 使用 Vuex 更新数组中的对象[重复]

    这个问题在这里已经有答案了 如何使用 Vuex 更新数组内的对象 我尝试了这个 但没有成功 const state categories mutations mutationType UPDATE CATEGORY state id cat
  • 当用户滚动经过页面的特定部分时,jQuery 触发操作

    大家好 我需要一个 jQuery 操作来在用户滚动经过页面上的某些位置时触发 这对于 jQuery 来说是可能的吗 我查看了 jQuery API 中的 scroll 我认为这不是我需要的 每次用户滚动时它都会触发 但我需要它在用户经过某个
  • 引用计数类和多线程

    我是多线程编程的新手 对此我仍然感到困惑 下面是我的引用计数类 class Rbuffer private char m pnData volatile unsigned int mRefCount public Rbuffer int n
  • Twitter Bootstrap - 动态添加/删除选项卡和选项卡内容

    预先感谢您的任何和所有输入 帮助 建议 我正在使用 Twitter Bootstrap 选项卡来组织一些信息 这些选项卡将位于表单页面上 每个选项卡将包含一个 联系人表单 用户可以在提交整个表单之前将多个联系人添加到此页面 div clas
  • ASP.Net Core 中没有智能感知

    通过 Visual Studio 安装 ASP Net Core gt 新项目 gt Web gt ASP Net Web 应用程序 gt 确定 gt ASP Net 5 模板 安装后重新启动系统 然后创建一个新项目ASP NET 5 Te
  • 用 Ruby 或 Python 解析 SVG 的库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 SVG 是一个庞大的标准 它基于 XML 我过去曾将 SVG 解析为 XML 然而 有些事情很难 例如
  • 将 tiff 像素长宽比更改为正方形

    我正在尝试对多页 tiff 文件执行条形码识别 但是 tiff 文件是从传真服务器 我无法控制 发送给我的 该服务器以非方形像素长宽比保存 tiff 这导致图像由于纵横比而被严重挤压 我需要将 tiff 转换为方形像素长宽比 但不知道如何在
  • 类型“CombinedVueInstance>>”上不存在属性“XXX”

    我使用 TypeScript 创建了一个 vue 组件 并且在以下位置收到此错误data and in methods Property xxx does not exist on type CombinedVueInstance
  • 制作一个网络爬虫/蜘蛛

    我正在考虑制作一个网络爬虫 蜘蛛 但我需要有人为我指明正确的方向才能开始 基本上 我的蜘蛛将搜索音频文件并为其建立索引 我只是想知道是否有人对我应该如何做有任何想法 我听说用 PHP 完成它会非常慢 我知道 vb net 那么这能派上用场吗
  • 图像未按顺序添加到 pdf 文档 itextsharp 中(元素顺序错误)

    我现在正在使用 iTextSharp 5 4 5 几个星期 本周 我在文档中的元素顺序方面遇到了一些奇怪的事情 我正在制作一份包含主题和图像 图表 的 pdf 报告 该文档的格式如下 NR 主题 1 的主题标题 主题 1 的图表图像 来自
  • Javascript增加最大数组大小[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个大小的数组2 32 4294967296 因为我试图通过运行筛算法来获取 2 32 之前的所有素数 但是 该数组中的任何操作都会出现以下错误 致命错误 CALL AND RETRY LAST 分
  • 增加导航栏高度

    我有以下代码 func navbarbutton UIView animateWithDuration 0 2 animations gt Void in let current self navigationController navi
  • hreflang 应该如何构建?

    我的问题是 应该像上面的所有页面一样 或者应该用每个页面的实际 url 进行更改 例如
  • 缓存行对齐(需要文章澄清)

    我最近在我的应用程序中遇到了我认为是错误共享的问题 我查了一下关于如何将我的数据与缓存行对齐 他建议使用以下 C 代码 C using C 0x alignment syntax template
  • PyCharm 无法解析 docker-compose.yml 以添加 Python 解释器,似乎正在使用旧版本

    我正在设置 PyCharm 的新实例 并想使用 docker compose 设置 Python 解释器 但 PyCharm 似乎不喜欢我的 docker compose 版本 首先 在 构建 执行 部署 gt Docker gt 工具 中
  • 根据内容对列表视图中的相似行进行分组

    i have a listview that displays a set of rows each row is clickable now i wish to group similar type of rows under one h
  • Oracle 的商业 Hotspot JVM 相对于 OpenJDK 有哪些性能优势?

    正如这个问题中所描述的 OpenJDK 与 Java HotspotVM https stackoverflow com q 44335605 1593077 Oracle 的商业 Hotspot JVM 本质上是 OpenJDK 加上一些
  • JavaScript 中的异步事件处理

    我在防止双重 多重 方面遇到问题eventListener代码中的处理 var locked button addEventListener click function if locked return locked true calcu
  • 使用 JPA2/Hibernate 保留 java.time.Instant (JDK8)

    JPA 和 Hibernate 目前都不支持 JDK8 中 JSR 310 带来的新日期 时间类 JPAticket https java net jira browse JPA SPEC 63 休眠ticket https hiberna
  • 在 Blazor 中显示计时器

    我正在尝试在服务器端 Blazor 应用程序中显示倒计时器 我的代码同时使用 F 和 C 语言 该代码在某种程度上可以工作 但计时器永远不会按预期停止 并且计时器显示偶尔不会呈现所有数字 这是我第一次尝试 Blazor 服务器端应用程序 我