C#服务在条件下运行进程

本文关键字:运行 进程 条件下 服务 | 更新日期: 2023-09-27 18:25:48

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

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

    • TWO:弄清楚自服务启动以来,我的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();
    }
  }
}

编辑:以供澄清

C#服务在条件下运行进程

我不清楚您是想在租约到期并续订时运行该程序,还是只在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类注册事件处理程序来消除所有轮询。每当IP地址发生更改时,NetworkAddressChanged事件就会触发。MSDN主题有一个很好的例子。

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