2017-06-06 10 views
0

私の質問は同じ宛先にすることですが、別の方法が必要です。今すぐDateTimeを作成して別のDateTimeと比較し、設定した時間差が正しいかどうかを確認してください。これまでのところとても良いですが、私はループがそのコードに入るたびに新しいプロパティを作成することを受け入れることができません。Windowsサービスで定義された時間後にメソッドを実行

同じ目的地に行く方法はありますか?もっと効果的な方法ではありますか?

私はあなたたちにここにいくつかのサンプルコードだ:

 private void RunService() 
     { 
      // Runs as long as the service didn't got a stop call. 
      while (!SetStop) 
      { 
       //Get MinutesToWait 
       this.MinutesToWait = 5; 

       DateTime CheckRunTime = this.LastRun; 
       CheckRunTime.AddMinutes(this.MinutesToWait); 

       if (DateTime.Now >= CheckRunTime) 
       { 
        // Imagine some good and smart and totally runnable code? 
       } 
      } 
     } 
+0

タイマーを使用することができます。https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx –

+0

「System.Threading.Timer 'オブジェクト?しかし正直なところ、私はあなたに再考することを強くお勧めします。 [*]タイマーを実行するWindowsサービスを作成している場合は、ソリューションを再評価する必要があります。*](https://weblogs.asp.net/jongalloway/428303)スケジュールされたタスクが適切です。 –

+0

@CodyGrayはとても興味深いBlogpostです。私は予定された仕事でそれをすることを検討すべきです...しかし、まだ、私は解決策に興味があります。 – Cataklysim

答えて

0

私が正しく理解している場合、何がやりたいことはいくつかの時間後にコードの一部を実行しているがサービスが開始されます。その場合は、timerを使用するのが最善の方法です。

まず、待機する時間をミリ秒単位に変換する必要があります。たとえば、5分は300000msに等しくなります。次に、実行するコードを別のメソッドに移動する必要があります。この例の名前はRunCode()です。

private void RunService() 
{ 
    var timer = new Timer(300000); 
    timer.Elapsed += (s, e) => this.RunCode(); 
    timer.Start(); 
    Thread.Sleep(Timeout.Infinite); 
} 

私たちがここでやっていることは次の通りである:そうのように最後に、あなたはあなたのタイマーを作成します。指定された時間は永遠に私たちのメインスレッドスリーピングタイマー

  • を開始
  • を通過した火災のタイマーのElapsedイベントにサブスクライブ300000ms
  • の間隔でタイマーをインスタンス化

    1. 。この行はオプションです。必要とするかどうかは、プログラムの構造によって異なります。タイマーを起動した後にコード内で何も起こらなければ、メインスレッドと拡張機能によってプログラム全体が終了します。しかし、無限のタイムアウトでそれを寝かせば、それを防ぐことができます。

    コードの実行が遅れていることが確実であれば、私が提供しているソリューションは非常にうまくいくはずです。しかし、私はこれがXY problemであるかもしれないと心配しています。これは、あなたが解決し易い別の問題のための解決策であることを意味します。だから私は尋ねる必要があります、なぜあなたはあなたのサービスでこれを必要としていますか?

  • +0

    Cody Grayは既にWindowsサービスが最善の方法ではないかもしれないとコメントしています。私は単に、コードの背後にあり、どのように動作するのかという理由で、スケジュールされたルーチンを必要とします。私はデータをチェックし、それを別のエンティティと比較し、データベースエントリを書き込むことができます。そのルーチンは終了する前に毎回ルーチンを起動する必要はありませんまた、我々はデータベースのエントリがどのくらい大きくなるかを知っていないし、別の値にチェック時間を変更したいかもしれません。スケジュールされたタスクは、このようなものです。 – Cataklysim

    +0

    また、 'System.Threading'リファレンスを使用していて、あなたのコードと同じように、タイマーcanntのコンストラクタが" 300000 "を処理するか、doenstが' Elapsed'を知っています... – Cataklysim

    +0

    このタイマーは 'System .Timers'名前空間。 'System.Threading.Timer'クラスは異なります。私は 'System.Timers.Timer'をやってみることをお勧めします。この代替方法は、スレッドセーフではありません。包括的な比較[here](https://web.archive.org/web/20150329101415/https://msdn.microsoft.com/en-us/magazine/cc164015.aspx)を参照してください。 – stybl

    0

    使用System.Timers

    static void Main(string[] args) { 
    
         Timer T = new Timer(); 
         T.Elapsed += Run; 
         T.Interval = 100; 
         T.Start(); 
    
    } 
    static void Run(object source, ElapsedEventArgs e) { 
    
    } 
    
    +0

    それはどういう風に私にいくつかの例を教えてくれますか?あなたがここで何をやっているのか常に尋ねている人が今はいないといつも期待していますか?たとえば、彼はあなたがカスタムイベントを購読していることを知らないかもしれません。また、あなたの解決策について説明してください。たとえば、Styの答えを見てください。 – Cataklysim

    関連する問題