我一直在努力(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();
}
}
答案 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)]
帮助保持服务状态。