.NET计划的任务-WqlEventQuery每30分钟执行一次

时间:2019-01-07 07:02:43

标签: c# .net scheduled-tasks console-application system.management

我正在与POC一起使用How to Schedule a Task In .NET Framework (C#)中提到的库。

我让代码在特定时间工作,但是如何使它每30分钟执行一次?

下面是我的主要方法:

static void Main(string[] args)
        {
            WqlEventQuery query = new WqlEventQuery("__InstanceModificationEvent", 
                new System.TimeSpan(0, 0, 1), 
                "TargetInstance isa 'Win32_LocalTime' AND TargetInstance.Hour=11 AND TargetInstance.Minute=08 AND TargetInstance.Second=59");

            ManagementEventWatcher watcher = new ManagementEventWatcher(query);
            watcher.EventArrived += Watcher_EventArrived;

            watcher.Start();
            System.Console.ReadLine();
        }

1 个答案:

答案 0 :(得分:1)

噢,男孩,您已经进入WQLWMI的土地。

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 docs认为使用__IntervalTimerInstruction创建计时器是一种旧技术。另外,我必须在管理员模式下运行Visual Studio实例才能使它运行。

要查看使用__IntervalTimerInstruction设置计时器的另一个示例,请参见here