哦,男孩,您已经进入了WQL和WMI的领域。
Win32_LocalTime描述了一个时间点,这就是您能够将事件设置为在特定时间触发的原因。如果您尝试使用它来描述间隔而不是时间点,那么您可以检查当前分钟是 0 还是 30。这样,您的事件会每隔一个半小时触发一次。例如,事件将在下午 6:00、下午 6:30、晚上 7:00、晚上 7:30 等触发。您可以通过检查TargetInstance.Minute
0 或 60 来检查分钟,如下所示:
WqlEventQuery query = new WqlEventQuery("__InstanceModificationEvent",
new System.TimeSpan(0, 0, 1),
"TargetInstance isa 'Win32_LocalTime' AND (TargetInstance.Minute=0 OR TargetInstance.Minute=30)");
此方法也适用于其他分钟间隔,例如 15 和 45。
但是,使用此方法的缺点是必须指定 30 分钟间隔的特定分钟数。此外,根据Win32_LocalTime
您执行此代码时的值,您的事件可能会在最初经过 30 分钟之前触发。例如,如果您在下午 6:45 执行此代码,并且您已将事件设置为在 0 分钟和 30 分钟触发,那么第一个事件将在 15 分钟后触发,而不是 30 分钟。
为了解决这个问题,您可以改用__IntervalTimerInstruction类。它专门以间隔生成事件。您可以通过创建它的实例并将ManagementEventWatcher设置为侦听在满足指定时间间隔后生成的__TimerEvent事件来使用它。
static void Main(string[] args)
{
ManagementClass timerClass = new ManagementClass("__IntervalTimerInstruction");
ManagementObject timer = timerClass.CreateInstance();
timer["TimerId"] = "Timer1";
timer["IntervalBetweenEvents"] = 180000000; // 30 minutes in milliseconds
timer.Put();
WqlEventQuery query = new WqlEventQuery("__TimerEvent",
"TimerId=\"Timer1\"");
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
watcher.EventArrived += Watcher_EventArrived;
watcher.Start();
Console.ReadLine();
watcher.Stop();
}
public static void Watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
Console.WriteLine("Event Arrived");
}
但是,请注意,使用Microsoft 文档__IntervalTimerInstruction
创建计时器被认为是一种遗留技术。此外,我必须在管理员模式下运行我的 Visual Studio 实例才能运行它。
要查看使用 设置计时器的另一个示例__IntervalTimerInstruction
,请参见此处。