Как использовать Quartz .net в форме Windows? - PullRequest
2 голосов
/ 19 февраля 2011

Я пытаюсь написать проект для использования Quart.net (http://quartznet.sourceforge.net/) создать систему планирования заданий (Quartz.NET - полнофункциональная система планирования заданий с открытым исходным кодом, которую можно использовать от самых маленьких приложений до крупномасштабных корпоративных систем). Но я не могу использовать listbox1.items добавить в метод execute. Как можно использовать элементы управления окнами формы Quartz?

using System.Threading;
using Quartz;
using Quartz.Impl;

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

       private void btnStart_Click(object sender, EventArgs e)
        {
            ISchedulerFactory schedFact = new StdSchedulerFactory();

            //Yeni bir zamanlayıcı oluşturulup çalıştırılıyor
            IScheduler sched = schedFact.GetScheduler();
            sched.Start();

            //Oluşturduğumuz görev(MyJob) hazırlanıyor

            JobDetail jobDetail = new JobDetail("myJob", null, typeof(MyJob));

            //Başlatıldıktan 20 sn sonra çalışacak bir SimpleTrigger oluşturuluyor. 
            //İlk çalışmadan sonra 10 sn arayla 5 kez daha tetiklenecek
            Trigger trigger = new SimpleTrigger("myFirstTrigger",
                                                   null,
                                                   DateTime.UtcNow.AddSeconds(20),
                                                   null,
                                                   5,
                                                   TimeSpan.FromSeconds(10));

            //Görev tetikleyici ile zamanlanıyor
            sched.ScheduleJob(jobDetail, trigger);
            //Uygulama bekletiliyor
            ManualResetEvent resetEvent = new ManualResetEvent(false);
            resetEvent.WaitOne();
        }
    }

    public class MyJob :Form1, IJob
    {

        public void Execute(JobExecutionContext context)
        {
            listBox1.Invoke(new Action(delegate()
            {
                listBox1.Items.Add(String.Format("Görev çalıştırıldı : {0}", DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")));
            }));

        }
    }
}

Как использовать следующие коды:


 public void Execute(JobExecutionContext context)
        {
            listBox1.Invoke(new Action(delegate()
            {
//.....
//...
//..
//.


ОШИБКА:

InvalidOperationException: Invoke или BeginInvoke не могут быть вызваны для обработчика окна до создания аудита.

Ответы [ 2 ]

1 голос
/ 02 августа 2012

OK!

Я потратил слишком много времени на эту проблему, заставив Quartz.net работать с формой Windows.

НО, у меня есть универсальное решение, которое, я надеюсь, поможет другим.

  1. Создайте класс IJOB как обычно

  2. Создание статического указателя на форму

  3. В основной форме есть открытая функция, которая называется что-то вроде:

    public void Execute()
    public delegate void ExecuteCallback();
    
  4. При выполнении проверьте, не требуется ли «Вызов»

  5. Создайте делегата и вызовите Invoke.

Затем, надеюсь, все проблемы с потоками будут устранены, вы можете вызывать любые элементы управления, вы можете перепланировать задание Quartz и т. Д.

public class RunMyTask: IJob
{

    public static SalesBuddy.Form1 CurrentForm = null;

    public RunMyTask()
    {
    }

    public void Execute(IJobExecutionContext context)
    {
        if (CurrentForm.InvokeRequired)
        {
            SalesBuddy.Form1.ExecuteCallback x = new SalesBuddy.Form1.ExecuteCallback(CurrentForm.Execute);
            CurrentForm.Invoke(x);

        }
        else
        {
            CurrentForm.Execute();
        }
    }
1 голос
/ 19 февраля 2011

Quartz.net создает объекты заданий на основе переданного типа.В вашем коде:

JobDetail jobDetail = new JobDetail("myJob", null, typeof(MyJob));

при попытке вызвать:

listBox1.Invoke(new Action(delegate()
            {
                listBox1.Items.Add(String.Format("Görev çalıştırıldı : {0}", DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")));
            }));

Вы выполняете это на только что созданном экземпляре формы в другом потоке (quartz.net выполняет заданияв заданном количестве рабочих потоков), который не отображается, поэтому вы получаете сообщение об ошибке.

Во избежание этого не следует вызывать код пользовательского интерфейса в вашем задании, не извлекайте задание из формы Form1.Разрешить связь между пользовательским интерфейсом и заданием через какой-либо шаблон наблюдателя, например EventAggregator.

...