C# で記述された単純な.NETアプリケーションでタイマーを使用したいと考えています。私が見つけることができる唯一のものは、Windows.Forms.Timer クラスです。コンソール アプリケーションのためだけにこの名前空間を参照したくありません。
コンソール アプリケーションで使用するための C# タイマー (またはタイマーのような) クラスはありますか?
C# で記述された単純な.NETアプリケーションでタイマーを使用したいと考えています。私が見つけることができる唯一のものは、Windows.Forms.Timer クラスです。コンソール アプリケーションのためだけにこの名前空間を参照したくありません。
コンソール アプリケーションで使用するための C# タイマー (またはタイマーのような) クラスはありますか?
System.Timers.Timer
そしてMagicKatが言うように:
System.Threading.Timer
ここで違いを確認できます: http://intellitect.com/system-windows-forms-timer-vs-system-threading-timer-vs-system-timers-timer/
また、MSDN の例は次の場所で確認できます。
http://msdn.microsoft.com/en-us/library/system.timers.timer(VS.80).aspx
そしてここ:
http://msdn.microsoft.com/en-us/library/system.threading.timer(VS.80).aspx
名前空間のTimer
クラスをお勧めします。また、名前空間内のクラスSystem.Timers
も興味深いものです。Timer
System.Threading
using System;
using System.Timers;
public class Timer1
{
private static Timer aTimer = new System.Timers.Timer(10000);
public static void Main()
{
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Enabled = true;
Console.WriteLine("Press the Enter key to exit the program.");
Console.ReadLine();
}
// Specify what you want to happen when the Elapsed event is
// raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}
}
MSDN ドキュメントの例。
私が知っている少なくともSystem.Timers.TimerクラスとSystem.Threading.Timerクラスがあります。
ただし、注意すべき点が1つあります(これまでにこれを行ったことがない場合)。たとえば、using句にSystem.Threading名前空間が既に含まれているが、実際にはSystem.Timersでタイマーを使用する場合は、これを行う必要があります。 :
using System.Threading;
using Timer = System.Timers.Timer;
Jon Skeetのマルチスレッドガイドにタイマーに関する記事があります。一読する価値があります: http ://www.yoda.arachsys.com/csharp/threads/timers.shtml
この質問は古く、既存の回答は当時の問題を十分にカバーしています。そんな中、新たな出来事が。
タイマーの使用は、何らかの処理を遅延させたり、一定の間隔で実行したりする方法です。次の 2 つのケースがあります。
(1) スレッドを気にせず、問題なく、混乱なく、短いコードを定期的に実行するだけです。プレーンな Windows フォーム タイマーが適していない場合はSystem.Timers.Timer
、そのSynchronizingObject
プロパティを使用すると、より簡単になりSystem.Threading.Timer
ます。
(2) あなたがコーディングしているものは、非同期並行処理の領域にあります。これは従来、エラーが発生しやすく、デバッグが困難であり、プレーン タイマーが使用されていたものを正しく表示することが困難でした。
ケース 2 の場合、従来のアプローチで回避できる可能性がありますが、注意してください。複雑さが潜んでいて、1 回だけでなく、最良の選択をしないと累積的な影響であなたを食い尽くす準備ができていることに注意してください。
あなたの状況がある種の「イベント」処理を扱う場合 (それがコード化されている方法が何であれ: キープレス、マウス ボタン、シリアル ポートからのバイト、ネットワーク接続からのバイト、測定からのバイトなど) は、リアクティブ プログラミングを検討する必要があります。
近年、リアクティブ プログラミングは、複雑さの罠に陥ることなく、これらの状況に対応するコーディング方法を発見しました。
したがって、技術的には、次のリンクは質問への回答です:System.Reactive.Linq
名前空間にあるタイマーです: Observable.Timer Method (System.Reactive.Linq)
公平を期すために、これはリアクティブ プログラミングの考え方と多くのゲームを変えるものでうまく機能するタイマーです。ただし、コンテキストによっては、最適なツールである場合とそうでない場合があります。
この質問は .NET 中心であるため、.NET Reactive Framework の優れた紹介に興味があるかもしれません。
または、明確で図解された、より一般的な (Microsoft 中心ではない) ドキュメントについては、これが良さそうです。
System.Timer
のTimerクラスは使用しないことをお勧めします。
System.Diagnostics.Stopwatch何かの実行にかかる時間を計るのが目標の場合