0

我有下面的 xml,我使用它读取预定的日期和时间以在预定的时间运行应用程序。

<AvSchedule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Days>
    <Day Name="Monday">true</Day>
    <Day Name="Tuesday">false</Day>
    <Day Name="Wednesday">false</Day>
    <Day Name="Thursday">false</Day>
    <Day Name="Friday">false</Day>
    <Day Name="Saturday">false</Day>
    <Day Name="Sunday">false</Day>
  </Days>
  <Time Hour="12" Minutes="15" />
</AvSchedule>

下面是我为反序列化 xml 而编写的代码:

AvSchedule avSchedule = null;


private void Deserialize()
{            
    FileStream fs = File.OpenRead(@"C:\Scheduler.xml");
    XmlSerializer serializer = new XmlSerializer(typeof(AvSchedule));
    Object obj = serializer.Deserialize(fs);
    if((obj != null) && (obj is AvSchedule))
    {
        avSchedule = obj as AvSchedule;
    }        
}

下面是我在服务启动时运行应用程序的实现。

protected override void OnStart(string[] args)
{
    //System.Diagnostics.Debugger.Launch();
    base.OnStart(args);
    Deserialize();
    Thread thr = new Thread( new ThreadStart(ScheduleThread));
    thr.Start();     
}



 public void  ScheduleThread()
 {                
       //Process logic should go here
        try
        {
            System.Diagnostics.ProcessStartInfo processStartInfo = new System.Diagnostics.ProcessStartInfo();
            processStartInfo.Arguments = "/Task {21211-A06D-4558-B833-98E8C7F62}";
            processStartInfo.FileName = "C:\\Program Files (x86)\\Logic\application.exe";
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo = processStartInfo;
            process.Start();
        }
        catch (Exception e)
        {
            Console.WriteLine("Unable to run", e.Message);
        } 

    }
}

///Sleep for 1 minute
Thread.Sleep(TimeSpan.FromMinutes(1));
}

}

现在我想在到达预定时间时运行上述应用程序。我需要将当前时间和日期与 xml 中的预定时间和日期进行比较,并按照预定的时间和日期运行应用程序。请为此提供实施帮助。

我还需要确保服务仅在达到预定时间和日期时运行(服务应该空闲,直到达到预定时间)

4

1 回答 1

1

我知道我没有直接回答你的问题,但是......不要重新发明轮子!

使用Quartz.net

Quartz.NET 是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统。

它非常健壮和可靠,您可以进行任何类型的调度。

它可以很好地处理不同的线程,而不是像您那样运行进程。

它具有 xml 配置,并且功能齐全

我在很多项目中都使用过它并且效果很好。

---评论后更新---------

使用计时器

下面的代码只是一个示例,您可以根据自己的需要进行调整

public class ScheduleThread 
{
    private readonly TimeSpan _timeSpan;
    private readonly Timer _timer;
    public bool IsRunning { get; protected set; }   
    public ScheduleThread()
    {
        IsRunning = false;
                    //set the timespan according your config            
        _timeSpan = new TimeSpan();
    }
    public void Start()
    {
        if (IsRunning == false)
        {
            IsRunning = true;
            StartTimer();
        }
    }
    private void StartTimer()
    {
                    _timer = new Timer(CallBack);
        _timer.Change(_timeSpan, TimeSpan.Zero);
    }
    public void Stop()
    {
        if (IsRunning)
        {
            _timer.Dispose();
            IsRunning = false;
        }
    }
    private void CallBack(object obj)
    {
        //if process is not running
        //start process
    }       
}
于 2013-03-05T10:32:44.493 回答