Как создать приложение планировщика заданий - PullRequest
1 голос
/ 12 июня 2010

У меня была задача (ха) создать приложение, которое позволит пользователям планировать приложение командной строки, которое у нас есть, с параметром.

Таким образом, приложение командной строки берет xml и «запускает его»

Итак, суть в том, что мне нужно либо создать службу Windows, либо узнать, как взаимодействовать со службой планировщика заданий, уже запущенной на компьютере (версия 1 Xp / 2003)

Сначала я подумалБыло бы легко запустить службу, а когда задание будет отправлено, рассчитайте время между запуском и запуском и настройте таймер для ожидания этого количества времени.Это лучше, чем проверять каждую минуту, пора ли бежать.

Если я ударился о стену, то понял, что не знаю, как связаться с работающей службой Windows.За исключением, может быть, создания файла с деталями и наличия службы с наблюдателем файлов для загрузки файла и изменения расписания.

Поэтому основные вопросы заключаются в том, как я могу выполнить этот код psedo

из клиента

 serviceThatIsRunning.Add(Job)

Или невмешательство в расписание задач или создание файлов .job с помощью c # 3.5

Редактировать:

Для пояснения я создал небольшой образецчтобы получить свои мысли о «бумаге»

Итак, у меня есть класс работы

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, добавить, удалить, изменить.

Вот небольшое приложение для Windows, которое я создал, чтобы показать, что класс 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 ]

1 голос
/ 12 июня 2010

Если вы хотите запланировать задачу с помощью планировщика задач, это может быть так просто, как показано ниже. Вам просто нужно настроить аргументы командной строки, которые вы передаете schtasks для ваших нужд. См. ссылку для подробного объяснения аргументов командной строки.

Process p = Process.Start("schtasks", commandArgs);
p.WaitForExit();
0 голосов
/ 14 июня 2010

В этой теме был ответ, которого больше нет, но я собираюсь попытаться создать прослушиватель, оставив порт открытым

WCF через службы Windows http://msdn.microsoft.com/en-us/library/ms733069.aspx

Также добавление атрибута

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

Помогает сохранить состояние службы.

0 голосов
/ 12 июня 2010

Если вы хотите запустить несколько задач, которые выполняются в разные промежутки времени, вы можете например, создайте класс JobThread, который определяет таймер, который инициализируется с помощью метода Initialize:

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

Кроме того, этот класс определяет список объектов Job. Эти задания выполняются из timerHandler.

Наконец, вы создаете одноэлементный класс JobManager, который определяет метод Start и Stop. В методе Start вы делаете что-то вроде этого:

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

Этот JobManager также имеет метод Initiliaze, который принимает параметр XmlNode. Этот метод будет анализировать Xml-задание, которое вы передаете из командной строки.

...