質問:フレームワークへの(管理された)ソースコードが利用可能であることを忘れないでください。あなたはそれをすべて取得するには、このツールを使用することができます。http://www.codeplex.com/NetMassDownloader
残念ながら、この特定のケースでは、実装の多くは、ネイティブコードであるので、あなたはそれを見るために得ることはありません...
彼らは、しかし、スレッドごとのスレッドではなくプールスレッドを使用することは間違いありません。
大きなコレクションのタイマーを実装する標準的な方法(カーネルが内部的にどのようにしているのか、間接的にタイマーの大きなコレクションがどのように終わっているのか疑うでしょう)は、リストをtime-満了 - システムは、リスト全体ではなく、期限切れになる予定の次のタイマーのチェックについて心配する必要があります。
これは、おおよそ、タイマーを開始するためのO(log n)と、実行中のタイマーを処理するためのO(1)を与えます。
編集:ちょうどJeff Richterの本を見ていた。彼は(Threading.Timerの)スレッドがすべてのTimerオブジェクトに対して単一のスレッドを使用していると言いますが、このスレッドは次のタイマー(つまり上のとおり)が期限切れであることを知り、必要に応じてコールバックをThreadPool.QueueUserWorkItemを呼び出します。これは、次の期限前にタイマーで1つのコールバックを処理し終わらないと、コールバックが別のプールスレッドに再入されるという効果があります。要約すると、たくさんのタイマーを持つことで大きな問題が発生するのではないかと疑いますが、同じタイマーで多数のスレッドが起動したり、コールバックが遅い場合にスレッドプールが枯渇する可能性があります。
優先度キューは、すべてのタイマーが最初に一括して追加され、並べ替えられ、後で追加されない限り、並べ替え済みリストより効率的です。 – RAL
確かに - 「期限切れのリストは確かに一種の優先待ち行列かもしれません - 私はソート操作を実行したリストを暗示するつもりはありません」 –
私はちょうど時間を過ごしましたsscliのコードを介して。 Rotorがリリースされて以来、.NET ThreadPoolが大幅に変更されたため、System.Threading.Timerも大幅に変更されている可能性があります。事実、タイマーは.NET 1.1ではひどく壊れていて、.NET 2.0では安全で安全な例外になるように固定されていました。 とにかく、Rotorではタイマはリンクされたリストに保持され、専用のTimer firingスレッドによって起動されます。ランタイム全体(複数のアプリケーションドメインにまたがっていても)に対して1つのタイマー起動スレッドがあります。 –