2017-01-15 2 views
0

Ich bin ein wenig verwirrt darüber, wie das funktionieren soll. Ich habe mehrere Objekte in einer XML-Datei gespeichert und diese Objekte haben eine Eigenschaft für TimeBetweenReposts (wie 10 Minuten) und TimesToRepost (wie 20 mal).Funktion ausführen alle X Minuten

Jedes Objekt in Teil sollte eine Funktion alle TimeBetweenReposts Minuten auslösen.

Wie kann ich das tun?

+0

Sie könnten eine Warteschlange aller Ereignisse in der richtigen Reihenfolge erstellen. Wählen Sie den ersten Artikel aus der Warteschlange, berechnen Sie, wie lange Sie warten müssen, warten Sie, verarbeiten Sie den Artikel, spülen Sie, wiederholen Sie. Oder jedes Objekt könnte 'NextTime' und' RemainingCount' beibehalten. Finden Sie die früheste 'NextTime', berechnen Sie die Wartezeit, .... Wenn mehrere Artikel gleichzeitig fällig sind, spielt es keine Rolle *. Wählen Sie einfach einen aus und wenn Sie nach dem nächsten fälligen Artikel suchen, wird dieser in der Zeit Null fällig. (* Es sei denn, die Verarbeitung eines Artikels ist zeitaufwändig. In diesem Fall können Sie sie an separate Threads übergeben, die parallel verarbeitet werden.) – HABO

+0

Ich habe versucht mit Threads, sehr schlechte Idee. CPU at 99% – qpBlaze

+0

Hatten Sie jeden Thread einen Timer oder Sleep (ohne CPU-Kosten), bis es Zeit war, etwas Arbeit zu tun, oder "spinwait" die Zeit in einer Schleife zu überprüfen und CPU so schnell wie möglich zu verbrauchen? – HABO

Antwort

0

Sie haben ein paar Optionen, Ihr einfachsten über einen separaten Thread zu schaffen wäre, die eine Funktion ausgeführt wird, die etwa wie folgt aussieht:

private void CheckTime() 
{ 
    while (!exitCondition) //So you can cleanly kill the thread before exiting the program. 
     { 
      if (nextCheck < DateTime.Now) 
      { 
       DoAction(); 
       nextCheck = DateTime.Now + TimeBetweenReposts; 
      } 
      Thread.Sleep(1000); //Can be tweaked depending on how close to your time it has to be. 
     } 

} 

Andernfalls könnten Sie Einträge in der System-Task-Scheduler machen.

0

Sie können einen Timer verwenden, um alle X Sekunden, Minuten oder was immer Sie brauchen, etwas zu tun.

Sie können einen Timer wie folgt implementieren:

public class XMLFilesManager 
{ 
    Timer tm = null; 

    public XMLFilesManager() 
    { 
     this.tm.Elapsed += new ElapsedEventHandler(XMLFilesManagerTimer_Elapsed); 
     this.tm.AutoReset = true; 
     this.tm = new Timer(60000); 
    } 

    public void Start() 
    { 
     this.tm.Start(); 
    } 

    public void Stop() 
    { 
     this.tm.Stop(); 
    } 

    protected void XMLFilesManagerTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     this.tm.Stop(); 

     try 
     { 
      Execute(); 
     } 
     catch (Exception ex) 
     { 
      // LOG ERROR 
     } 
     finally 
     { 
      this.tm.Start(); 
     } 
    } 

    private void Execute() 
    { 
     // PUT YOUR BUSINESS LOGIC HERE 
    } 
} 

Dann Sie eine Eigenschaft hinzufügen können, die Geschichte Ihrer Ausführung zu speichern, wie:

// History of your object executions : object's identifier, last execution time and nb times you have execute the function for this object 
List<Tuple<int,DateTime,int>> objectExecutionHistory = null; 

Und in der ausführen Funktion Schleife deine XML-Objekte und mache, was du zu tun hast.

Verwandte Themen