時間が指定された DateTime オブジェクトに追いついた場合にイベントをスローするために使用できる .NET フレームワークのクラスはありますか?
そうでない場合、これを確認する際のベスト プラクティスは何ですか? 常にチェックする新しいスレッドを作成しますか? タイマー(天国は禁じられています;))?
私はスレッドアプローチには行きません。スリープ スレッドはユーザーの CPU 時間を消費しませんが、カーネル/システムの CPU 時間を消費します。次に、.NET ではスレッドのスタック サイズを調整できません。したがって、スリープだけでも、2MB のヒット (新しいスレッドのデフォルトのスタック サイズであると思います) が無駄になります。
System.Threading.Timer の使用。効率的なタイマー キューを使用します。軽量で、すべてのタイマー間で再利用される 1 つのスレッドでのみ実行される何百ものタイマーを持つことができます (ほとんどのタイマーが同時に起動しないと仮定します)。
スレッドがスリープ状態の場合、CPU 使用率は消費されません。非常に簡単な方法は、DateTime までスリープするスレッドを持つことです。例えば
DateTime future = DateTime.Now.Add(TimeSpan.FromSeconds(30));
new Thread(() =>
{
Thread.Sleep(future - DateTime.Now);
//RaiseEvent();
}).Start();
これは基本的に、将来の日付 (今から 30 秒) を取得することを意味します。次に、時間の差のためにスリープするスレッドを作成します。次に、イベントを発生させます。
編集:タイマーに関する情報を追加します。タイマーに問題はありませんが、もっと手間がかかると思います。時間の差の間隔でタイマーを設定できます。これにより、時間が日時オブジェクトに追いついたときに tick イベントが発生します。私はお勧めしませんが、これについてはあなたも考えていると思いますが、5 秒ごとにタイマーをオフにして、時間が一致するかどうかを確認するという方法があります。私はそのアプローチを避け、やるべき作業があるまでスレッドをスリープ状態にすることに固執します。
タイマーはおそらく悪い方法ではありません。DateTime.Now を使用して、目標時間を超えているかどうかを検出します。時間を分または時間などに正規化しようとしない限り、== を使用しないでください。