2017-11-26 6 views
0

Ich verwende die Quartz.NET-Bibliothek, um einen Job in meiner C# -Anwendung zu erstellen.Wie man ein neues Windows Form mit Quartz.NET ohne Probleme instanziiert?

Ich habe einige Register in meiner Datenbank, also habe ich eine Tabelle, die eine Spalte namens "start_date" enthält. Der Job wird alle 50 Sekunden ausgeführt. Daher vergleiche ich die Daten aus der Spalte "start_date" mit dem Datum meines Computers. Wenn die Daten identisch sind, möchte ich ein neues Windows Form mit einer Nachricht und einer Schaltfläche instanziieren.

Im Moment ist die neue Windows Form im richtigen Moment öffnet, aber die Nachricht nicht gezeigt wird und das Fenster zu reagieren aufhört.

Grundsätzlich in meinem Code ich habe so etwas wie dies:

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(); 
       } 
      } 
     } 
    } 
} 

Jemand eine Idee vom Grund Warum reagiert das FormMessage-Fenster nicht mehr?

Vielen Dank für Ihre Aufmerksamkeit!

+0

der Initialisierung im 'FormMessage loszuwerden() {}' es ein leerer Konstruktor machen. Ändern Sie 'formMessage.Show() ', um die Methode' .ShowModal() 'zu verwenden, erstellen Sie eine automatische Eigenschaft für die Nachrichtenvariable und weisen Sie sie einmal im Konstruktor von FormMessage (difference) zu oder übergeben Sie einen Standardparameter für string.Empty an Dieser Konstruktor und nutzen/nutzen Sie das 'this.' Konstrukt wichtiger .. Verwenden Sie Namespace als auch .. Lassen Sie uns wissen, ob einer dieser Empfehlungen für Sie arbeiten – MethodMan

+0

Hallo, vielen Dank für die Aufmerksamkeit. Ich glaube du meintest '.showDialog()', habe ich recht? Da nur die 'formMessage.Show()' in 'formMessage.showDialog()' geändert wird, läuft die Anwendung gut! Vielen Dank. Ich habe die Dokumentation gelesen, aber nicht sehr gut verstanden, können Sie bitte den Unterschied zwischen den Methoden erklären? – skyyyyy

+0

ja das ist genau das, was ich meinte .. und du bist willkommen für die Hilfe froh, dass ich dir helfen konnte – MethodMan

Antwort

0

Sie können Quartz Hörer versuchen, sie das Formular öffnen zu lassen, die Daten zu zeigen, und die Ausführung halten aus dem Arbeitsbereich:

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); 

und den Hörer hinzufügen, um den Scheduler:

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

Mit diesem 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); 
    } 
} 

ich dies so nicht getestet haben, wenn der dataMap keine Daten haben, gehen müssen Sie die persistance ermöglichen:

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

Ich werde diese Lösung versuchen. Danke für Ihre Hilfe! – skyyyyy

Verwandte Themen