我正在实施类似方法的预定作业,并缩小到方法。一个实现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并忘记。现在我试图了解这两种方法的优缺点。最后,事件本身在不同的线程上运行。从理论上和实践中,应该采用两者中的哪一个来处理许多这样的事件触发器,以便跨多个实例进行缩放。
也欢迎任何其他方法。
答案 0 :(得分:1)
使用计时器,而两者都使用@Evk所指示的相同时钟,但第一种方法永久运行计时器。
使用Task.Delay将同样准确,但完成延迟和启动新延迟之间存在短暂差距。经过很长一段时间后,它们会变得不同步。因此,5到2秒间隔的距离与开始计时的时间不一样。
使用永久运行的计时器不会出现此问题。
答案 1 :(得分:1)
方法A 。当您必须在触发某项任务之间定期间隔时,使用方法B 。
如果事件处理程序(触发后执行的任务)需要更长的时间来处理,则会有所不同。
方法A: 无论事件处理程序中的任务花费多少时间,事件处理程序都会在设置的时间间隔内保持触发(代码必须是可重入的)。
方法B: 任务完成然后我们睡觉。因此,如果任务需要不同的时间来完成,则下一次触发也在不同的时间