2011-07-15 9 views
3

一定の時間が経過してもオブジェクトが失効します。今私は10秒ごとにイベントを発生させ、オブジェクトコレクションを実行し、何かが期限切れになっているかどうかを見るためにシングルタイマーを使用しています。タイマーを効率的に使用するには

これの代わりに、各オブジェクトにタイマーを追加し、希望の時刻に期限切れになるようにイベントを発生させることを検討しています。 私は最も適切なタイマーはだと思いますSystem.Timers.Timer 誰もこれについて考えていますか?

私はテストリグを持っていますので、私が現在持っているものとリファクタリングされた実装を比較することができますが、これは私が始める前に良いアイデアだと思っています。

+2

あなたはこれよりも比較のために探している場合は、そこに最高の一品です。 [.NET Frameworkクラスライブラリのタイマークラスの比較](http://msdn.microsoft.com/en-us/magazine/cc164015.aspx) –

+0

オブジェクトが期限切れになった後はどうなりますか?彼らはごみになるのですか? – trendl

+1

代わりに、オブジェクト内の 'events'でシグナリングを使用していませんか?期限切れの各オブジェクトは「私は今や期限切れです」と通知し、このイベントのすべてのサブスクライバは、10秒ごとのデータの代わりにオンタイムのデータを保持します。 –

答えて

1

あなたが言及したものよりもSystem.Threading.Timerが好きです。その理由は、System.Timers.Timerが未処理の例外をすべて消費し、アプリケーションのエラーを隠すためです。

また、オブジェクトのリストを作成し、それをタイマーメソッドでトラバースすることもできます。

唯一の理由は、オブジェクトがちょうど10秒後に(11秒または12秒ではなく)チェックすることが重要な場合です。すべての実行に要する時間によって異なります。

4

オーバーヘッドのために、私はそれほど多くのタイマーを作成しません。

おそらく、1つのタイマーを持つ方が良いでしょう。このタイマーは10秒ごとに起動してはならず、次の要素の有効期限が切れるとトリガーされます。あなたは何らかの「ちょっとした時間の引き金」を持っています

あなたが200の要素を持っていて、最初のものが2秒で期限切れになったら、最後の要素が2年ほどで期限切れになることなく2秒のタイマーを持つことができます...

+0

+1これは最も効率的なソリューションのようです。コレクションを繰り返して古いアイテムをスイープするときは、次の最も古いアイテムを書き留めて、その値を次のタイマーのインターバルに使用します。 – Groo

+0

興味深いアイデア。 1つのタイマーで、コレクション内のすべてのオブジェクトがイベントに配線されます。私がイベントを正しいオブジェクトに送ることができれば、それはさらに良いものになります。 – Noel

1

期限切れのオブジェクトが本当に「自己破棄」できないと仮定すると、オブジェクトが期限切れになっているかどうかをチェックする単一の静的タイマーに行き、コレクションから削除する前にそれらを廃棄します。

System.Timers.Timerはこのタスクには適していますが、try..catchですべてをラップするようにしてください。単一のキャッチされていないエラーがタイマーを止める原因となり、通知が得られなくなるためです。

0

有効期限が設定されたオブジェクトのリストはありますか?

OBJ1は、12時38分56秒 OBJ4で期限が切れる、12時37分14秒 OBJ3で期限が切れる、午前12時35分01秒 obj2ので期限が切れる我々は有効期限の時間がわかっている場合は12時43分44秒

で期限が切れますコレクションが作成されると、オブジェクトを削除する必要があるときに、単一のタイマーと間隔のリストを使用してタイマーをトリガーすることができます。

   Wait time in seconds  To Be Removed 
int1  12:35:01 - now()    obj1 
int2  12:37:14 - 12:35:01    obj2 
int3  12:38:56 - 12:37:14    obj3 
int4  12:43:44 - 12:38:56    obj4 

A「)デルタリスト」の最初のエントリをPEEK(私はそれが前にこれを呼ばれるが、あなたの引用を与えることができなかった聞いたことがある)と、待ち時間にタイマ間隔を設定します。

B)タイマーが起動すると、デルタリストから最初のエントリを削除し、ソースコレクションのオブジェクトで何を行う必要があるかを行います。

戻る

にアイテムがコレクションに追加されたとき、あなたは正しい位置にデルタリストに新しいエントリを追加する必要があります。過度に複雑ではありませんが、追加の途中でタイマーが飛び出すことがあります。

長所: タイマーは1つのみです。それだけで十分です。オブジェクトごとのタイマーは、多くのリソースを吸い取ることになります。

起動時にコレクション全体を確認し、新しいアイテムが追加されるたびに部分的にスキャンするだけで済みます。

決して失効しません。それは重要ではないかもしれませんが、一定の時間のチェックは、私たちがいくつかのアイテムを削除することに遅れていることを意味します。

短所: 単純にタイマーポップでコレクション全体をスキャンするよりも実装が複雑です。

何かを変更する前に、現在の実装が問題を引き起こしていますか?

必要に応じて、また毎回リストをスキャンする必要がない場合にのみ、タイマーのポップアップからパフォーマンスのバンプが発生します。 100エントリーか100,000話ですか?パフォーマンスのバンプが目立つでしょうか?

「タイムアウト後に削除された」「期限切れ」期限切れがなくなりました。これは問題ですか?

HTH、 アラン

関連する問題