0

原始问题: 到目前为止,我有以下代码可用于测试目的。我需要能够在启动后运行我的代码中的进程,并且只有在我的 DHCP 租约被更新/释放或(我想检查 IP 地址的变化时)。话虽如此,我需要帮助的事情:

  • 一:如何让线程任务按时间间隔执行,(**下面的评论提供了一些帮助**)

    • 二: 确定自服务启动以来我的 DHCP 租约是否已更改/续订/释放。在感谢您之前,我对任何混淆表示歉意。*

编辑更新:我已经更新了我的代码,老实说,我已经弄清楚了计时器,我只需要帮助找出最好的方法来了解 dhcp 租约何时或是否已从以前更新/发布和更新/IP 更改,以便我可以查看是否当我检查定时间隔是否已更改为运行 exe 时。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.ServiceProcess;
using System.IO;
using System.Timers;

namespace MyWindowsService
{
  class Program : ServiceBase
  {
    private static Process p = new Process();
    private static System.Timers.Timer aTimer;
    //private static Thread thread = new Thread(new ThreadStart(WorkThreadFunction));
    static void Main(string[] args)
    {
      //Set the location of the DHCP_Opion text creater.
      p.StartInfo = new ProcessStartInfo(@"C:\NetLog\DHCPSolution-Option120.exe");
      ServiceBase.Run(new Program());
    }

    public Program()
    {
      this.ServiceName = "New_Service_Test";
      p.Start();
      // Create a timer with a ten second interval.
      aTimer = new System.Timers.Timer(30000);

      // Hook up the Elapsed event for the timer.
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

      // Set the Interval to 2 seconds (2000 milliseconds).
      aTimer.Interval = 30000;
      aTimer.Enabled = true;
      //Garbarge collection.
      GC.KeepAlive(aTimer);
    }

    protected override void OnStart(string[] args)
    {
      //TODO: place your start code here
      base.OnStart(args);
    }

    protected override void OnStop()
    {
      //TODO: clean up any variables and stop any threads
      base.OnStop();
    }

    // Specify what you want to happen when the Elapsed event is  
    // raised. 
    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
         p.Start();
         p.WaitForExit();
    }
  }
}

编辑:澄清。

4

1 回答 1

2

我不清楚您是想在租约到期并续订时运行该程序,还是仅在 IP 地址更改时才运行该程序。

如果你想知道IP地址何时改变,你在程序启动时获取IP地址,然后每隔一个定时器间隔检查一次。所以,你会写:

private static string CurrentIPAddress;

public Program()
{
    this.ServiceName = "New_Service_Test";
    CurrentIpAddress = LocalIPAddress();
    p.Start();

    // initialize timer, etc.
}

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    string myIp = LocalIPAddress();
    if (myIp == CurrentIPAddress)
    {
        // hasn't changed.
        break;
    }
    CurrentIpAddress = myIp;
    p.Start();
    p.WaitForExit();
}

LocalIpAddress方法来自https://stackoverflow.com/a/6803109/56778

您可以通过向NetworkChange类注册事件处理程序来消除所有轮询。NetworkAddressChanged每当 IP 地址更改时,都会触发该事件。MSDN 主题有一个很好的例子。

如果您想确定 DHCP 租约何时更新,即使 IP 地址没有更改,您可能必须深入研究 WMI 接口,我对此知之甚少。

于 2013-08-02T02:50:56.463 回答