2016-03-29 15 views
0

私はタイマーループをC#で実装しようとしています(コードを実行するたびに30ミリ秒かかる)。これは難しいことではありません.SOのここでの他の質問はすでにthis、またはthis oneのようにこの問題に対処しています。C#のタイマーループ、コードが完了していないのを待つ

最も難しい部分は、コード部分がループ時間以上続く可能性があることです。この場合、私はそれが終わるまで待っています(もう30ミリ秒の待ち時間はありません)。

例:

0 ms - 最初の繰り返し:コードは20 msで完了しました。

30ミリ秒 - 2回目の反復:コードは時間通りに完了しません。

60 ms - 2番目の反復コードが終了するまで待機します。合計41ミリ秒で終了。

71ミリ秒 - 3回目の繰り返し:コードは15ミリ秒で完了しました。

101ms - 4回目の反復:コードは22msで完了しました。

など。

タスクを使用して完了しているかどうかを確認する必要がありますか? それを行うための公正でエレガントな方法は何ですか。 ご協力いただければ幸いです。おかげさまで

編集: 試行のカップルの後に、このコードは、サンプルコードで動作しているようですが、生産コードで、後に見ることができます: https://dotnetfiddle.net/cqmTzF

+1

を持っていますあなたは何か試しましたか?もしそうなら、例がありますか? –

+0

はい、もう少し試しましたが、明らかに有効な解決策があります。私はその質問を編集した。 –

答えて

1

はこのような何かを試してみてください:

public class PeriodicAction 
    { 
     private int _frequencyMs; 
     private readonly Timer _timer; 
     private bool _enabled; 

     public Action ActionMethod { get; private set; } 

     public int FrequencyMs 
     { 
      get { return _frequencyMs; } 
      set 
      { 
       _frequencyMs = value; 
       _timer.Change(0, _frequencyMs); 
      } 
     } 

     public bool Enabled 
     { 
      get { return _enabled; } 
      set 
      { 
       _timer.Change(value ? 0 : Timeout.Infinite, _frequencyMs); 
       _enabled = value; 
      } 
     } 

     public bool IsRunning { get; private set; } 

     public PeriodicAction(Action actionMethod, int frequencyMs) 
     { 
      this.ActionMethod = actionMethod; 
      this._frequencyMs = frequencyMs; 
      this._timer = new Timer(timerCallbackMethod, null, 0, frequencyMs); 
     } 

     private void timerCallbackMethod(object sender) 
     { 
      if (IsRunning) return; 

      IsRunning = true; 

      ActionMethod(); 
      _timer.Change(0, _frequencyMs); 

      IsRunning = false; 
     } 
    } 
+0

あなたの答えをありがとう、私のコードを実装するのに役立ちました。 –

関連する問題