如何使用Quartz.net实例化新的窗口



我正在使用Quartz.net库在我的C#应用程序中创建作业。

我的数据库中有一些寄存器,因此我有一个表,其中包含一个名为" start_date"的列。该作业每50秒运行一次,因此我比较了" start_date"列的日期。使用我的计算机日期,如果日期相等,我想实例化带有消息和按钮的新窗口。

目前,新的窗口表格在正确的时刻打开,但没有显示消息,窗口停止了响应。

基本上,在我的代码中,我有类似的东西:

formMessage.cs

public partial class FormMessage : Form
{
    public FormMessage()
    {
        InitializeComponent();
    }
    public FormMessage(double minutes)
    {
        InitializeComponent();
        string message = string.Format("You have {0} minutes!", minutes);
        lblMessage.Text = message ;
    }
    private void btnOK_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}

JobMessage.cs

public class JobMessage: IJob
{
    List<Information> informations;
    public void Execute(IJobExecutionContext context)
    {
        //Class with methods to get registers from database.
        InformationAPI infoAPI = new InformationAPI();
        informations = infoAPI.GetInformations();
        foreach (Information info in informations)
        {
            DateTime computerDateTime = DateTime.Now;
            DateTime infoDateTime = info.StartDate;
            double difference;
            if (DateTime.Compare(computerDateTime, infoDateTime) < 0)
            {
                difference = Math.Round(infoDateTime.Subtract(computerDateTime).TotalMinutes);
                if (difference == 5)
                {
                    FormMessage formMessage = new FormMessage(difference);
                    formMessage.Show();
                }
            }
        }
    }
}

有人对formmessage窗口停止响应的原因有所了解?

谢谢您的关注!

您可以尝试使用石英侦听器,让他们打开表单以显示数据并使执行范围脱离工作范围:

Action<IJobExecutionContext, JobExecutionException> listenerAction = (c, e) => {
    var dataMap = context.GetJobDetail().GetJobDataMap();
    var difference = dataMap.GetIntValue("difference");
    FormMessage formMessage = new FormMessage(difference);
    formMessage.Show();
}
var listener = new SyncJobListener(listenerAction);

并将侦听器添加到调度程序中:

scheduler.ListenerManager.AddJobListener(listener, 
    GroupMatcher<JobKey>.GroupEquals("GroupName"));

使用此SyncJobListener

public class SyncJobListener : IJobListener
{
    private readonly Action<IJobExecutionContext, JobExecutionException> _syncExecuted;
    public string Name { get; private set; }
    public SyncJobListener(
        Action<IJobExecutionContext, JobExecutionException> syncExecuted
        )
    {
        Name = Guid.NewGuid().ToString();
        _syncExecuted = syncExecuted;
    }
    public void JobToBeExecuted(IJobExecutionContext context)
    {
    }
    public void JobExecutionVetoed(IJobExecutionContext context)
    {
    }
    public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
    {
        _syncExecuted(context, jobException);
    }
}

我尚未对此进行测试,因此,如果dataMap没有任何数据,则需要允许持久性:

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class JobMessage: IJob {}

最新更新