如何创建任务计划程序应用程序

时间:2010-06-11 21:01:17

标签: c# windows-services scheduled-tasks

我一直在努力(ha)创建一个应用程序,允许用户使用参数安排我们的命令行应用程序。

因此命令行应用程序需要一个xml并“运行它”

所以底线我要么需要创建一个Windows服务,要么学习如何与已经在盒子上运行的Task Scheduler服务进行交互(版本1 Xp / 2003)

起初我虽然很容易进行服务运行并且在提交作业时,计算现在和运行之间的时间并设置一个计时器来等待那段时间。如果是时候运行,那么最好每分钟检查一次。

如果我撞到了墙,我就会重新开始,我不知道如何与正在运行的Windows服务进行通信。除了可能创建一个包含详细信息的文件,并使用文件观察程序来加载文件并修改计划。

因此,基本问题是如何执行此psedo代码

来自客户

 serviceThatIsRunning.Add(Job)

或者使用c#3.5与任务计划或使用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();
    }
}

3 个答案:

答案 0 :(得分:1)

如果您想使用任务计划程序安排任务,则可能如下所示。您只需要根据需要自定义传递给schtasks的命令行参数。有关命令行参数的详细说明,请参阅此link

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

答案 1 :(得分:0)

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

m_timer = new 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作业。

答案 2 :(得分:0)

这个帖子上有一个答案已经不存在但是,我将尝试通过保持端口打开来创建一个监听器

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

同时添加属性

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

帮助保持服务状态。

相关问题