2015-01-07 7 views
5

10分または15分ごとに操作を実行するプログラムを作成しています。私はそれがすべての時間を実行したいので、私は処理能力で安いものが必要です。これまでに読んだことは、私がタイマーを使いたいことを示唆しているようです。ここに私がこれまで持っていたコードのクリップがあります。C#プログラムの実行を一時停止する

class Program { 
    private static Timer timer = new Timer(); 

    static void Main(string[] args) { 
     timer.Elapsed += new ElapsedEventHandler(DoSomething); 
     while(true) { 
      timer.Interval = TimerMilliseconds(); // The duration of the wait will differ each time 
      timer.Enabled=true; 
     } 
    } 
} 

ここでの問題は、whileループがすぐに実行を継続することです。タイマーが経過するまで実行を停止するにはどうすればいいですか?私のプログラムは本当にマルチスレッドである必要はありません。タイマーはこの仕事の正しいツールですか?

ありがとうございました!

更新:混乱して申し訳ありません。私はDoSomethingメソッドを実装しました。私はそれが私の問題の一部だとは思わないので、私はちょうどそれを含めなかった。それはいくつかの方法で実行するためにタイマーを待っていない - 割り当て超えると以上を語っ実行します

+3

ヒント:whileループを削除し、DoSomethingを実装してください。また、MREをSet()して、アプリケーションを正常に終了できるようにすることもできます。 – Vlad

+4

さらに、アプリケーションを[Windowsサービス](http://msdn.microsoft.com/en-us/library/y817hyb6%28v=vs.110%29.aspx) –

答えて

4

Timerさんは、指定された時間が経過するとElapsedイベントを発生させます。あなたが終了するからプログラムを維持するConsole.ReadKeyなどのブロッキング呼び出しを持っている必要はありませんので、あなたはまた、サービスとしてこれを実装することができ

private static Timer timer = new Timer(); 

static void Main(string[] args) 
{ 
    timer.Elapsed += new ElapsedEventHandler(DoSomething); 
    timer.Interval = TimerMilliseconds(); // The duration of the wait will differ each time 
    timer.Enabled=true; 

    Console.ReadKey(); //Wait for keypress to terminate 
} 

私はこのような何かをするだろう。

最後に、あなただけのイベントハンドラに間隔を変更できます。

static void DoSomething(...) 
{ 
    timer.Stop(); 
    timer.Interval = TimerMilliseconds(); 

    ... 
    timer.Start(); 
} 
+0

これは私が望むように見えます。私はSystem.Timers.Timerを使用しています。タイマーを手動で停止する必要がありますか? AutoResetパラメータが設定されていないと自動的に停止すると思いますか? – Joe

+1

@Joeあなたは*停止*する必要はありませんが、プロセスが長時間実行されていてタイマー間隔が短い場合は、同時に2つの実行が可能です。それはあなた次第で、あなたはおそらくそれなしで逃げることができます。 – BradleyDotNET

2

このコードの問題は、あなたがTimerIntervalEnabledプロパティを設定するためにループを使用しているということです、 。

アプリケーションをmutlithreadedする必要がない場合は、実行の間にThread.Sleepを呼び出すことをお勧めします。

class Program {  
    static void Main(string[] args) { 
     while(true) { 
      Thread.sleep(TimerMilliseconds()); // The duration of the wait will differ each time 
      DoSomething(); 
     } 
    } 
} 
+0

にすることを検討することもできます私はThread.sleepを使用しているのは、いいえでした。 – Joe

+1

Thread.Sleepはこちらです*おそらく* OKですが、タイマーはまだまだ良いです – BradleyDotNET

1

whileループを完全に削除します。

DoSomething()関数の中で(一度実装された)開始時にタイマを停止し、最後にタイマを再起動する前に間隔をリセットします。

0

を私がコメントやanswrsが既に必要なヒントを提供すると思いますが、MSDN docs for Timerが実際に素敵な例を提供します。私の意見では、Timerのアプローチはちょっと調子が悪く、あなたの意図を読んだり、スケジュールされたコードを呼び出す詳細を抽象化したりするのが簡単です。

1

ロジックからタイマーとループを取り出します。 15分後にWindowsスケジューラを使用してプログラムを実行してください。または、Windowsサービスを使用することもできます。お読みくださいBest Timer for using in a Windows service

0

ここでは、ManualResetEventとWaitOne()を使用する別の方法があります。これにより、間違ったキー入力によって誤って殺されることを心配することなくメインスレッドを停止することができます。

class Program 
{ 

    private static Timer timer; 
    private static ManualResetEvent mre = new ManualResetEvent(false); 

    static void Main(string[] args) 
    { 
     timer = new Timer(TimerCallback, null, 0, (int)TimeSpan.FromMinutes(15).TotalMilliseconds); 
     mre.WaitOne(); 
    } 

    private static void TimerCallback(object state) 
    { 
     // ... do something in here ... 
     Console.WriteLine("Something done at " + DateTime.Now.ToString()); 
    } 

} 
関連する問題