2010-06-11 74 views
1

我一直在做任务(ha)创建一个应用程序,该应用程序将允许用户使用参数计划我们的命令行应用程序。如何创建任务计划程序应用程序

所以在命令行应用程序需要一个XML和“运行为”

所以底线我要么需要创建一个Windows服务或学习如何与Task Scheduler服务已经在包装盒上运行的互动(第1版Xp/2003)

起初我虽然很容易让一个服务运行,当提交一个作业时,计算从现在开始到运行的时间,并设置一个计时器来等待这段时间。这是更好的,然后检查每一分钟是否需要运行。

如果我碰壁了,我已经放弃了我不知道如何与正在运行的Windows服务进行通信。除了可能创建一个包含详细信息的文件,并使用文件观察器来加载该文件并修改计划。

所以根本的问题是我怎么能执行此psedo代码从客户

serviceThatIsRunning.Add(Job) 

或者与任务进度ineracting或使用C#3.5

编辑创建的.job文件:

澄清我创建了一个小样本,让我对“纸”的想法

所以我有一个招聘类

public class Job 
{ 
    #region Properties 
    public string JobName { get; set; } 
    public string JobXML { get; set; } 
    private Timer _JobTimer; 
    public Timer JobTimer 
    { 
     get 
     { 
      return _JobTimer; 
     } 
    } 

    #endregion 

    public void SetJobTimer(TimeSpan time) 
    { 
     if (_JobTimer != null) 
     { 
      _JobTimer.Dispose(); 
     } 

     _JobTimer = new Timer(new TimerCallback(RunJob), null, time, time); 

    } 

    private void RunJob(Object state) 
    { 
     System.Diagnostics.Debug.WriteLine(String.Format("The {0} Job would have ran with file {1}", JobName, JobXML)); 
    } 

    public override string ToString() 
    { 
     return JobName; 
    } 

    public void StopTimer() 
    { 
     _JobTimer.Dispose(); 
    } 
} 

现在我需要创建一个应用程序来容纳这些工作,是不断运行的,这就是为什么我虽然Windows服务,然后一个Windows应用程序,以允许用户使用作业列表。

所以问题是如果我创建一个Windows服务如何与该服务中的方法进行交互,以便我可以更改JobList,添加,删除,更改。

这是我创建的一个小窗口应用程序,用于显示Job类的运行情况。有趣的一点是,如果我正确地做到这一点,我不会将作业添加到列表框中,并且Add方法退出,作业计时器部分仍然运行并且不会被垃圾收集器拾取。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnAddJob_Click(object sender, EventArgs e) 
    { 
     Job job = new Job(); 

     job.JobName = txtJobName.Text; 
     job.JobXML = txtJobXML.Text; 
     job.SetJobTimer(new TimeSpan(0, 0, Convert.ToInt32(JobTime.Value))); 

     // ??Even If I don't add the Job to a list or ListBox it seems 
     // ??to stay alive and not picked up by the GC    
     listBox1.Items.Add(job); 
    } 

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (listBox1.SelectedIndex > -1) 
     { 
      Job job = listBox1.Items[listBox1.SelectedIndex] as Job; 

      txtJobName.Text = job.JobName; 
      txtJobXML.Text = job.JobXML; 
     } 

    } 

    private void btnRemove_Click(object sender, EventArgs e) 
    { 
     Job job = listBox1.Items[listBox1.SelectedIndex] as Job; 
     job.StopTimer(); 
     listBox1.Items.Remove(job); 
    } 

    private void btnCollect_Click(object sender, EventArgs e) 
    { 
     GC.Collect(); 
    } 
} 
+0

为什么选择投票? – Mike 2010-06-12 16:27:41

+0

作为您的日程安排的灵感需要看看http://quartznet.sourceforge.net/,它可以处理许多不同的调度需求。 – 2010-06-17 14:51:33

回答

0

有在这个线程了,他说已经不存在,但我会尝试保持开放的端口

WCF通过Windows服务 http://msdn.microsoft.com/en-us/library/ms733069.aspx

也加入属性创建一个监听器

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

有助于保持服务的状态。

1

如果您想要使用任务调度程序来安排任务,它可能如下所示。您只需自定义您传递给schtasks的命令行参数以满足您的需求。有关命令行参数的详细说明,请参阅此link

Process p = Process.Start("schtasks", commandArgs); 
p.WaitForExit(); 
0

如果你想开始,在不同的时间间隔运行多个任务,您可以 创建实例类JobThread定义正在使用的初始化方法初始化的计时器:

m_timer =新的Timer (新的TimerCallback(this.timerHandler),null,this.Interval,this.Interval);

此外,这个类定义了一个Job对象列表。这些作业从timerHandler执行。

最后,您将创建一个定义Start和Stop方法的单例JobManager类。 在Start方法,你做这样的事情:

 foreach (var jobThread in this.m_jobThreads) 
     { 
      jobThread.Initialize(); 
     } 

这JobManager也有一个接受的XmlNode参数Initiliaze方法。此方法将解析从命令行传递的Xml作业。

+0

为什么不使用Windows的内置计划任务管理器(即schtasks)来管理这个? – 2010-06-11 21:47:25

+0

也有可能,但是如果你的作业以不同的时间间隔运行,你仍然需要一个Timer机制。或者,不同的计划任务。 – 2010-06-11 23:22:06

相关问题