1

時間が指定された DateTime オブジェクトに追いついた場合にイベントをスローするために使用できる .NET フレームワークのクラスはありますか?

そうでない場合、これを確認する際のベスト プラクティスは何ですか? 常にチェックする新しいスレッドを作成しますか? タイマー(天国は禁じられています;))?

4

3 に答える 3

4

私はスレッドアプローチには行きません。スリープ スレッドはユーザーの CPU 時間を消費しませんが、カーネル/システムの CPU 時間を消費します。次に、.NET ではスレッドのスタック サイズを調整できません。したがって、スリープだけでも、2MB のヒット (新しいスレッドのデフォルトのスタック サイズであると思います) が無駄になります。

System.Threading.Timer の使用。効率的なタイマー キューを使用します。軽量で、すべてのタイマー間で再利用される 1 つのスレッドでのみ実行される何百ものタイマーを持つことができます (ほとんどのタイマーが同時に起動しないと仮定します)。

于 2008-10-15T21:37:36.880 に答える
0

スレッドがスリープ状態の場合、CPU 使用率は消費されません。非常に簡単な方法は、DateTime までスリープするスレッドを持つことです。例えば

    DateTime future = DateTime.Now.Add(TimeSpan.FromSeconds(30));
        new Thread(() =>
        {
            Thread.Sleep(future - DateTime.Now);
            //RaiseEvent();
        }).Start();

これは基本的に、将来の日付 (今から 30 秒) を取得することを意味します。次に、時間の差のためにスリープするスレッドを作成します。次に、イベントを発生させます。

編集:タイマーに関する情報を追加します。タイマーに問題はありませんが、もっと手間がかかると思います。時間の差の間隔でタイマーを設定できます。これにより、時間が日時オブジェクトに追いついたときに tick イベントが発生します。私はお勧めしませんが、これについてはあなたも考えていると思いますが、5 秒ごとにタイマーをオフにして、時間が一致するかどうかを確認するという方法があります。私はそのアプローチを避け、やるべき作業があるまでスレッドをスリープ状態にすることに固執します。

于 2008-10-15T21:05:45.167 に答える
0

タイマーはおそらく悪い方法ではありません。DateTime.Now を使用して、目標時間を超えているかどうかを検出します。時間を分または時間などに正規化しようとしない限り、== を使用しないでください。

于 2008-10-15T21:37:54.493 に答える