2016-08-19 6 views
1

System.Threading.Timerまたは.netのタイマーが実際にどのように低レベルの用語で動作するかを知りたいと思っています。私が得ようとしているのは概要です。System.Threading.Timer低レベルの実装

私の疑問は、一度実行されたタイマ、スレッドまたはプロセスが常に実行中であること、時間が終了したことを通知する方法、クロックやPITなどの割り込みのように受け取るかどうかです。スレッドやプロセスが実行されていない可能性がある場合は、常に実行されているとは限りません。

+1

これはCLRに組み込まれており、.NETバージョン間で大きく変化しています。すべてのCLRバージョンでソースコードが公開されているわけではありませんので、この質問に直接答えはありません。マイクロソフトサポートへの電話でない限り、尋ねるべきではありません。 *本当の*問題がどのようなものかを知りたがっていることは間違いありません。違いはありません。 –

答えて

2

スレッドを使用すると動作しますが、それは非常に非効率的です。

タイマーは単なるデータ構造です。 .NET側のデータ構造とカーネルデータ構造があります。カーネルは、締切り期限が到来するとスレッドに通知する方法を知っています。スレッドが座って待つ必要はありません。 (これを少し簡略化します)

タイマーをさらに安くするためにできるだけ小さなカーネルタイマーを作成しようとする.NETベースの最適化レイヤーがあります。基本的に、すべてのタイマーは待ち行列に入っています。 最も早い .NETタイマーが経過したときに経過した単一のカーネルタイマーがあります。

タイマーは実際には安いです。

+0

私は疑いがあるので、ある時間間隔で実行中のプロセスが、キュー内のタイマーを確認して経過時間を確認しているようですか? – kprincipe

+0

タイマのセットが変更されるたびに、フレームワークは最も早いものが経過する時間を計算します。そのデッドラインのカーネルタイマーを設定します。有効期限が過ぎると、すぐに.NETレベルのタイマーとして経過し、次の.NETレベルのタイマーで経過するようにカーネルタイマーを再設定します。 – usr

+0

最近のフレームワークバージョンの内部について説明するCoreclrチケットが見つかりました:https://github.com/dotnet/coreclr/issues/6155興味があるので興味深いかもしれません。 – usr

0

私はその正確な実装について知りませんが、新しいスレッドを開始し、現在のシステムチックカウントを記録し、開始チックカウントを現在のチックカウントと比較するループを設定すると思います。設定された間隔に達すると、事実上コールバックを発生させます。低レベルでは、ポインタを使用してスコープ外の関数を呼び出します。

タイマーはミリ秒まで正確にはありません。解像度は約15msだと思います。

これが実際に行われた方法であれば、私は完全に自信がありません。

関連する問題