使用计时器间隔与任务延迟重复执行任务

2023-12-20

我正在实施一项预定的工作,例如方法,并已缩小到方法范围。一种实现计时器间隔,另一种基于任务延迟。

我还考虑过使用 Azure 计时器触发的 Web 作业,但它们不能在多实例模式下工作。实际上,在多实例应用程序中,其中一个实例中仅触发一个触发器,而其他实例则被锁定,因此增加应用程序的实例计数不会增加触发的事件数量。

方法 A(定时器间隔)

using System;
using System.Threading.Tasks;
using System.Timers;

public class Example
{
    public static void Main()
    {
        var aTimer = new Timer();
        aTimer.Interval = 5000;
        aTimer.Elapsed += OnTimedEventA;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;

        var bTimer = new System.Timers.Timer();
        bTimer.Interval = 2000;
        bTimer.Elapsed += OnTimedEventB;
        bTimer.AutoReset = true;
        bTimer.Enabled = true;

        Console.WriteLine("Press the Enter key to exit the program at any time... ");
        Console.ReadLine();
    }
    private static void OnTimedEventA(Object source, System.Timers.ElapsedEventArgs e)
    {
        Task.Run(() =>
        {
            Console.WriteLine("The Elapsed event A was raised at {0}", DateTime.Now);
        });
    }
    private static void OnTimedEventB(Object source, System.Timers.ElapsedEventArgs e)
    {
        Task.Run(() =>
        {
            Console.WriteLine("The Elapsed event B was raised at {0}", DateTime.Now);
        });
    }
}

方法 B(任务延迟)

using System;
using System.Threading.Tasks;
public class Example
{
    public static void Main()
    {
        EventAAsync();
        EventBAsync();

        Console.WriteLine("Press the Enter key to exit the program at any time... ");
        Console.ReadLine();
    }
    private static async Task EventAAsync()
    {
        while (true)
        {
            Task.Run(() =>
            {
                Console.WriteLine("The Elapsed event A was raised at {0}", DateTime.Now);
            });
            await Task.Delay(TimeSpan.FromSeconds(5));
        }
    }
    private static async Task EventBAsync()
    {
        while (true)
        {
            Task.Run(() =>
            {
                Console.WriteLine("The Elapsed event B was raised at {0}", DateTime.Now);
            });
            await Task.Delay(TimeSpan.FromSeconds(2));
        }
    }
}

方法 A 和方法 B 的功能相同。 他们都以 5 秒和 2 秒的固定间隔调用火灾事件 A 和 B,然后忘记了。现在我正在尝试了解这两种方法的优缺点。最后,事件本身在单独的线程上运行。理论上和实践中,应该采用两者中的哪一个来处理许多此类跨多个实例扩展的事件触发器。

也欢迎任何其他方法。


Method A当您必须定期触发某些任务时使用。Method B当您必须在某些任务的触发之间提供定期间隔时使用。

如果事件处理程序(触发器后执行的任务)需要更长的时间来处理,则存在差异。

方法一:无论事件处理程序中的任务花费多少时间,事件处理程序都会以设置的时间间隔持续触发(代码必须是可重入的)。

方法B:任务完成然后我们睡觉。因此,如果任务需要不同的时间来完成,则下一次触发也会在不同的时间

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用计时器间隔与任务延迟重复执行任务 的相关文章

随机推荐

  • template.ParseGlob() 可以解析子目录中的模板吗?

    为了清理模板文件夹 我想将常用模板保存在子文件夹中 目前我有以下文件结构 main go templates index tpl Main template for the main page templates includes head
  • 翻译 WordPress 插件标题

    如何翻译 WordPress 插件标头 我已经使用以下方法翻译了插件中的所有字符串 and e 功能 po 文件 文本域 WordPress 加载语言文件的函数 load plugin textdomain mnbaa seo false
  • 为什么我的 As400 无法从新创建的成员别名中进行选择?

    我已经按照此描述设置了代码question https stackoverflow com questions 346512 sql query of multi member file on as400 创建别名和删除别名一样有效 对于我
  • 不使用reverse() 或[::-1] 反转字符串?

    我遇到了一个奇怪的 Codecademy 练习 它需要一个函数 该函数将字符串作为输入并以相反的顺序返回它 唯一的问题是你不能使用相反的方法或 stackoverflow 上的常见答案 1 显然 在现实的编程世界中 人们很可能会选择扩展切片
  • WinForm 应用程序中的 Microsoft 报表教程

    我在我的 WinForm 应用程序项目中使用 Microsoft Report 我对表达式 组 甚至过滤器和其他许多东西有一些问题 我正在寻找 Microsoft Report 的完整教程 但直到现在我还没有找到任何教程 可以你帮我找个教程
  • 静态变量初始化顺序

    C 保证编译单元 cpp 文件 中的变量按照声明的顺序进行初始化 对于编译单元的数量 这一规则分别适用于每个编译单元 我指的是类之外的静态变量 但是 变量初始化的顺序在不同的编译单元中是未定义的 我在哪里可以看到关于 gcc 和 MSVC
  • Log4cplus RollingFileAppender 是否异步

    我将为我们的应用程序添加 Log4cplus 我们的应用程序是用 C 编写的 并且是多线程的 我想使用 Log4Cplus RollingFileAppender 来实现同样的目的 我知道Log4Cplus源自Java Log4j 由于我不
  • 在集群内运行 kubectl

    我有一个 Kubernetes 1 10 集群已启动并正在运行 使用以下命令 我创建一个在集群内运行 bash 的容器 kubectl run tmp shell rm i tty image centos bin bash 我在正在运行的
  • 将对象转换为键值对象数组,例如 `{ name: "Apple", value: "0.6" }`

    我有一个这样的对象 const total Apple 0 6 Banana 0 6 Orange 1 Grapes 0 4 Pineapple 0 4 现在我想将其转换为键值对象数组 其中每个对象具有相同的两个属性集 name and v
  • gnuplot 中带有参数图的 for 循环

    我正在尝试在 gnuplot 4 6 中绘制多个参数曲线 在早期版本 4 4 中 命令 set para 为 a 1 10 a cos t a sin t 绘制 pi pi 参数模式和迭代之间的语法歧义是当前 gnuplot 版本中已记录的
  • 如何提取 vcxproj 中每个编译单元的编译参数?

    我正在尝试获取每个编译单元的编译参数 以便我可以创建 编译命令 json http clang llvm org docs JSONCompilationDatabase html 对于我的 vcxproj 它可以与 clang 的 lib
  • 如何在 Cython 中使用 128 位整数

    在我的 64 位计算机上long long类型有 64 位 print sizeof long long prints 8 我需要使用 128 位整数 幸运的是海湾合作委员会支持这些 https gcc gnu org onlinedocs
  • 如何读取 PDF 文本矩阵

    我正在编写一个程序来直接从我的程序创建 PDF 文件 我已经使用了 PDF 参考手册 并设法弄清楚除了一件事之外的所有内容 文本矩阵 它一定是我读过的最令人困惑的东西 谷歌搜索 重新阅读 重新谷歌搜索 重新阅读 但仍然不理解它 就在我以为我
  • 元刷新和重定向页面?

    我创建了一个带有 META 标记的网页 如下所示 问题是移动浏览器不支持此元标记 尽管它确实在每个浏览器上的网络中正确重定向 网页的完整代码在这里
  • 无法使用 000webhost 连接到数据库

    我正在尝试学习 php 但是当我尝试连接到 mysql 数据库时 出现此错误 我认为代码本身没有任何问题 但主机端可能有错误 我使用的是000webhost 警告 mysqli mysqli mysqli mysqli 28000 1045
  • 如何修复“参数列表太长”错误?

    我执行了这个命令 从文件夹 train 中的大量文件 大约 3000 个 中删除所有出现的 perl pi e s g Users Kian Desktop Acsegment espslabs train 但我得到了这个错误 bin ba
  • 单词表-uima ruta

    实际上我在Wordlist中使用了一些CITY名称和PUBLISHERS名称 根据我的理解 Wordlist将注释文档中任何列表项的所有出现 但是我发现一个问题 当我更改列表项的顺序时 出现的次数增加或减少列表中的文本 例如 Script
  • WebApi Route 返回 Not Found in Orchard Module

    我正在创建一个 Orchard 模块 我想在其中添加 WebApi 控制器 我的模块 txt Name ModuleName AntiForgery enabled Author The Orchard Team Website http
  • 处理 XXX.js 的源映射花费的时间比 YYY 毫秒长,因此我们继续执行而不等待所有断点

    Edit 这实际上也发生在新创建的准系统 React Typescript 模板 ViteJS 应用程序上 并且零修改 在 App tsx 中放置断点会使 VS Code 调试器启动速度慢得难以忍受 原帖如下 我正在尝试 ViteJS 也许
  • 使用计时器间隔与任务延迟重复执行任务

    我正在实施一项预定的工作 例如方法 并已缩小到方法范围 一种实现计时器间隔 另一种基于任务延迟 我还考虑过使用 Azure 计时器触发的 Web 作业 但它们不能在多实例模式下工作 实际上 在多实例应用程序中 其中一个实例中仅触发一个触发器