2013-03-05 105 views
0

我有下面的xml使用我读取计划的日期和时间在计划的时间运行应用程序。使用Windows服务和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中的计划时间和日期进行比较,并按照计划的时间和日期运行应用程序。请为此提供实施帮助。

我也需要确保服务达到预定时间,每天只运行时(服务应该是空闲状态,直至达到预定时间)

回答

1

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

使用Quartz.net

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

它非常强大和可靠,你可以做任何类型的调度。

它处理的是非常不同的线程,而不是像你在做的那样运行进程。

它有xml配置,它是full features

我已经在很多项目中使用过它,它工作得很好。

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

使用低于Timer

代码只不过是你能适应你的需求为例

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 
    }  
} 
+0

你可以请提供其他解决方案?我无法在我的应用程序中使用第三方应用程序。 – user004 2013-03-05 12:08:07

+0

@ user004你试过我的例子吗? – giammin 2013-03-05 15:21:09

+0

这就是我正在寻找..感谢很多giammin – user004 2013-03-06 03:50:10