Application.Idleイベントの重要性
-
29-10-2019 - |
質問
Application.Idle
イベントについて私が知っているのは、アプリケーションが処理を終了し、アイドル状態になりそうなことです。
どこかで読んだ
スレッドが次のようになる前に実行する必要のあるタスクがある場合 アイドル状態の場合は、このイベントに添付してください
つまり、スレッドがアイドル状態になる前、またはスレッドがアイドル状態になった後にタスクが実行されるということですか?
プロジェクトには、以下に示すコードが少しあります。データベースの更新はアイドル時間中に実行されていますか? ジェネラコディセタグプレ
解決
まず、Application.Idleは「スレッドアイドル」ではなく、アプリケーションのUIスレッドでのメッセージ処理に関するものであることを理解してください。 (スレッドアイドルはメッセージループアイドルとは異なります)
WinFormsアプリは、メッセージをキューからプルするメッセージループによって駆動されます。そのキューが空になると、メッセージループはクワイエット状態になり、次のメッセージがメッセージキューに表示されるまで効率的にスリープします。これにより、CPU処理リソースを節約でき(ループで回転するサイクルが無駄になると、マシンで実行されている他のプロセスからCPU時間が奪われるため、すべてが遅く感じられます)、消費電力の削減やノートパソコンのバッテリー寿命の延長にも役立ちます。
アプリのメッセージループは通常、メッセージキューのバックログをかなり頻繁に使い果たします。編集ボックスに入力しているときのキーストロークの間でも同様です。
Application.Idleイベントは、複数のスレッドに関与することなく、アプリの主要な操作とは非同期にアプリケーションのハウスキーピングの雑用を処理するのに便利な場所になりました。
メニューとボタンは通常、たとえばアプリケーションがアイドル状態になったときに、対応するコマンドの状態に一致するように有効または無効になります。表示される外観はユーザー時間でのみ更新する必要があるため(ユーザーは、数ミリ秒後の視覚状態の変更と比較して、内部状態の変更時に視覚状態の変化の違いを正確に識別できません)、アプリケーションのアイドルイベントは次のようになります。このようなハウスキーピングの雑用を処理するためのシンプルで効果的な機会。
WinformsアプリのApplication.Idleにコードを挿入して、データベースまたはネットワークリソースを確認できます。ただし、Application.Idleをブロックすると、アプリのUI全体がフリーズするため、「長い時間」かかることは行わないように注意する必要があります。通話をブロックする代わりに非同期通話を使用します。
また、Application.Idleイベントが発生する速度は非常に変動することに注意してください。ユーザーとアプリケーションの動作に応じて、1秒間に数回発生する場合と、数秒間発生しない場合があります。定期的にデータの更新を確認する場合は、Application.Idleの代わりにタイマーイベントを使用する必要があります。 Application.Idleが起動するたびに非同期ネットワーク要求を開始すると、1秒あたりの(冗長な)要求がサーバーに殺到する可能性があります。