代码之家  ›  专栏  ›  技术社区  ›  Mike

如何创建任务调度程序应用程序

  •  1
  • Mike  · 技术社区  · 14 年前

    我的任务是(ha)创建一个应用程序,允许用户调度一个命令行应用程序,我们有一个参数。

    所以命令行应用程序接受一个XML并“运行它”

    所以底线是,我要么需要创建一个Windows服务,要么学习如何与已经在盒子上运行的任务调度程序服务交互(版本1 xp/2003)

    首先,我认为运行服务很容易,当提交作业时,计算从现在到运行之间的时间,并设置一个计时器来等待该时间。最好是每分钟检查一下是否该跑步。

    如果我撞到墙上了,我会很高兴,我不知道如何与正在运行的Windows服务进行通信。除了可以创建一个包含详细信息的文件,并让服务与文件监视程序一起加载文件和修改计划。

    所以下面的问题是如何执行这个psedo代码

    来自客户

     serviceThatIsRunning.Add(Job)
    

    或使用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服务,我该如何与该服务中的方法进行交互,以便更改作业列表、添加、删除和更改。

    这是我创建的一个小Windows应用程序,用于显示作业类是否运行。有趣的是,如果我做得正确,我不会将作业添加到列表框中,而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();
        }
    }
    
    3 回复  |  直到 12 年前
        1
  •  1
  •   Taylor Leese    14 年前

    如果您想使用任务调度程序来调度一个任务,它可以像下面这样简单。您只需要自定义传递到的命令行参数 schtasks 为了你的需要。看到这个 link 有关命令行参数的详细说明。

    Process p = Process.Start("schtasks", commandArgs);
    p.WaitForExit();
    
        2
  •  0
  •   S P    14 年前

    如果要启动以不同时间间隔运行的多个任务,可以 例如,创建一个类jobthread,它定义一个使用initialize方法初始化的计时器:

    m_timer=新计时器(new timercallback(this.timerHandler),空,this.interval,this.interval);

    此外,这个类还定义了一个作业对象列表。这些作业是从TimerHandler执行的。

    最后,创建一个singleton jobmanager类,该类定义了一个start和stop方法。 在Start方法中,您执行如下操作:

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

    此JobManager还具有接受xmlnode参数的initiliaze方法。此方法将解析从命令行传递的XML作业。

        3
  •  0
  •   Mike    14 年前

    这个线程上有一个不再存在的答案,但是,我将尝试通过保持端口打开来创建一个侦听器。

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

    同时添加属性

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    

    有助于保持服务状态。