2

私のプロジェクトでは、3 分経過後にメソッドを呼び出せるようにしたいと考えています。言うべき「メイン ループ」がないので、ストップウォッチを使用して 3 分が経過したかどうかを常に確認することはできません。私が考えることができる他の唯一の解決策は、3 分の間隔を持つ Timer オブジェクトですが、3 分の遅延後に一度だけ呼び出されるため、かなり面倒です。

読んでくれてありがとう。

編集:言及するのを忘れました。これはサーバー アプリケーション用であるため、スレッドの実行を一時停止することはできません。その間に他の処理を処理する必要があるからです。また、このタイマー機構だけではありません。一度に数百から数千の同時タイマーが存在する場合があります。

4

5 に答える 5

6

Timerオブジェクトに関するあなたのアイデアは正しい方法だと本当に信じています。使い方に慣れているようですが、例を次に示します。

    aTimer = new System.Timers.Timer(1000 * 60 * 3);
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Enabled = true; 

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

于 2012-06-09T18:22:49.097 に答える
1

これらのタイマーが数百または数千ある場合は、一部のスケジューリングで機能します。

あなたは本当にquartznetを調査する必要があります

多くの同時タイマーは、私が経験したようにうまく機能しません.quartznetはそうします.

アプリケーションでこれらのスケジューリング タスクが本当に必要な場合は、おそらくこの記事でいくつかのアイデアが得られます。.NET のタスク スケジューラ クラス ライブラリ

于 2012-06-09T18:27:27.853 に答える
0

タイマーを使用します。

1000 個のタイマーを作成するとオーバーヘッドがわずかに発生しますが、それほど大きくはありません。タイマーはその役割を果たし、3 分が経過するとイベントを発生させます。また、コードを 3 分ごとに繰り返したい場合は、タイマーが適しています。

于 2012-06-09T18:27:12.360 に答える
0

タイマーは限られたリソースであるため、タイマーは数百/数千のソリューションには適していません。

すべてのメソッドは同じアプリケーションから呼び出されますか?

その場合、datetime と Action を持つ小さなスタブ クラスを作成し、呼び出されるメソッドにデリゲートをターゲット時間と共に追加します。次に、バックグラウンド スレッドでリストをループし、必要に応じてデリゲートを呼び出します (明らかにそれらを削除します)。

別の解決策は、呼び出されるメソッドごとに QueueUserWorkItem のようなことを行い、メソッドが呼び出されるまでスレッド内で最初に適切な時間スリープすることです。

すべての解決策 (私のものを含む) について、GUI を操作している場合に行う必要があるマーシャリング、またはスレッドの同時実行の問題を回避するために行う必要がある可能性のあるロックに注意してください。

于 2012-06-09T18:27:26.353 に答える