使用定时器间隔与任务延迟重复的任务

时间:2017-10-16 05:58:16

标签: c#

我正在实施类似方法的预定作业,并缩小到方法。一个实现Timer Interval,另一个基于Task Delay。

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

方法A(计时器间隔)

if (Keys.KEYCLICKSTATE)
{
    Keys.mouse_event(Keys.MouseLeftDown, 0, 0, 0, new UIntPtr());
    Keys.mouse_event(Keys.MouseLeftUp, 0, 0, 0, new UIntPtr());
    Thread.Sleep(25);
}

方法B(任务延迟)

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);
        });
    }
}

方法A和方法B在功能上都是一样的。 他们都以5s和2s的固定间隔呼叫火灾事件A和B并忘记。现在我试图了解这两种方法的优缺点。最后,事件本身在不同的线程上运行。从理论上和实践中,应该采用两者中的哪一个来处理许多这样的事件触发器,以便跨多个实例进行缩放。

也欢迎任何其他方法。

2 个答案:

答案 0 :(得分:1)

使用计时器,而两者都使用@Evk所指示的相同时钟,但第一种方法永久运行计时器。

使用Task.Delay将同样准确,但完成延迟和启动新延迟之间存在短暂差距。经过很长一段时间后,它们会变得不同步。因此,5到2秒间隔的距离与开始计时的时间不一样。

使用永久运行的计时器不会出现此问题。

答案 1 :(得分:1)

当您必须定期触发某项任务时,会使用

方法A 。当您必须在触发某项任务之间定期间隔时,使用方法B

如果事件处理程序(触发后执行的任务)需要更长的时间来处理,则会有所不同。

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

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

相关问题