2017-01-15 21 views
0

これはどのように動作するのかちょっと混乱します。 XMLファイルに複数のオブジェクトが保存されていて、これらのオブジェクトにはTimeBetweenReposts(10分)とTimesToRepost(20回など)のプロパティがあります。X分ごとに関数を実行

各オブジェクトは、TimeBetweenReposts分ごとに機能を起動する必要があります。

どうすればいいですか?そうしないと、システムのタスクスケジューラにエントリを作ることができる

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. 
     } 

} 

+0

予定の順にすべてのイベントのキューを作成できます。キューから最初のアイテムを選択し、待つか、待つか、アイテムを処理するか、すすぎ、繰り返すかを計算します。あるいは、各オブジェクトは 'NextTime'と' RemainingCount'を維持することができます。最も早い 'NextTime'を見つけて、待ち時間を計算してください。複数のアイテムが同時に支払期限が到来する場合、それは本当に問題ではありません。ちょうど1つを選んで、次のアイテムをチェックするときはゼロ時間で終了します。 (*項目を処理するのに時間がかかる場合を除き、その場合はスレッドを別のスレッドに渡して並列に処理したいかもしれません。) – HABO

+0

スレッドで試しましたが、とても悪い考えです。 CPUで99% – qpBlaze

+0

各スレッドは、何らかの作業を行うまでタイマーまたはスリープ(CPUコストなし)を使用しましたか、ループで時間をチェックし、CPUをできる限り速く消費する「spinwait」ですか? – HABO

答えて

0

あなたはいくつかのオプションを持って、あなたの最も簡単な、このようなものに見える機能を実行する別のスレッドを作成することです。

0

タイマーを使用して、何秒でも何分でも何かを行うことができます。あなたのような、あなたの実行履歴を保存するためにプロパティを追加することができ、その後

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 
    } 
} 

あなたはこのようなタイマーを実装することができ

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

そして機能を実行します、あなたのXMLオブジェクトをループし、あなたがしなければならないことをやりなさい。

関連する問題