3

スレッド プールを使用せずに C# で定期的なタスク/スレッドを実行する方法はありますか (これは私が持っている主な要件の 1 つです)。

予想されるシナリオは次のとおりです。

  1. 定期的なスレッドは、(システムからの) タイマー イベントをブロック/待機します。
  2. タイマーが切れると、システムはスレッドに通知します。
  3. スレッドはいくつかのコードを実行します。
  4. スレッドは、システムからの次のタイマー イベントをブロック/待機します (スレッドが 1 つ以上のタイマー イベントを逃した場合、これは問題ないことに注意してください)。

これに最も近いのはSystem.Forms.Timer.

プロパティを介してこれSystem.Timers.Timerを処理できるようです。ただし、上記のシナリオに従ってSynchronizingObjecta を実装する方法がよくわかりません。ISynchronizeInvoke私が見つけた実装用のコード サンプルはすべて、このISynchronizeInvokeような単純なシナリオを処理するには複雑すぎるように思えます。

上記のシナリオのように (スレッドプールを使用せずに) C# でこの機能を簡単に実装する方法はありますSystem.Forms.Timerか?

4

4 に答える 4

4

Windows タイマーのデフォルトの解像度は、ドキュメントから 15.6 ミリ秒です。

Windows の既定のシステム全体のタイマー分解能は 15.6 ミリ秒です。これは、オペレーティング システムが 15.6 ミリ秒ごとにシステム タイマー ハードウェアからクロック割り込みを受信することを意味します。クロック割り込みが発生すると、Windows はタイマー ティック カウントを更新し、スケジュールされたタイマー オブジェクトの有効期限が切れたかどうかを確認します。一部のアプリケーションでは、タイマーの有効期限が 15.6 ミリ秒ごとに 1 回よりも頻繁に処理される必要があります。

また、次のようにも述べています。

アプリケーションは timeBeginPeriod を呼び出して、タイマーの分解能を上げることができます。グラフィック アニメーション、オーディオ再生、またはビデオ再生をサポートするために、1 ミリ秒の最大解像度が使用されます。これにより、アプリケーションのタイマーの解像度が 1 ミリ秒に増加するだけでなく、グローバル システム タイマーの解像度にも影響します。これは、Windows が少なくともアプリケーションが要求する最高の解像度 (つまり、最小の間隔) を使用するためです。したがって、1 つのアプリケーションのみが 1 ミリ秒のタイマー分解能を要求する場合、システム タイマーは間隔 (「システム タイマー ティック」とも呼ばれます) を少なくとも 1 ミリ秒に設定します。詳細については、MSDN® Web サイトの「timeBeginPeriod 関数」を参照してください。

したがって、高精度のタイマーが本当に必要な場合は、timeBeginPeriod呼び出しを使用してグローバル システム タイマーに影響を与えることができますが、それが動作しているデバイスのバッテリ寿命/電力消費に影響することを知っておいてください。

また、次の例のように、.net でより低いレベルの精度を取得するために使用できるQueryPerformanceCounterおよびQueryPerformanceFrequency呼び出しがあります。ネット

于 2013-10-13T03:31:32.163 に答える
0

スレッドを単純にスリープさせようとしましたか?

int msecSleepTime = 25;  // number of milliseconds to sleep
Thread.Sleep(msecSleepTime);  // sleep the current thread for the given number of milliseconds
于 2013-10-13T03:14:19.923 に答える