10

このイベントについて私が知っているのApplication.Idleは、アプリケーションが処理を終了し、アイドル状態になりそうなことです。

私はどこかでそれを読みました

スレッドがアイドル状態になる前に実行する必要のあるタスクがある場合は、それらをこのイベントにアタッチします

つまり、これは、スレッドがアイドル状態になる前、またはスレッドがアイドル状態になった後にタスクが実行されることを意味しますか?

以下に示すように、プロジェクトに少しコードがあります。データベースの更新はアイドル時間中に実行されていますか?

private void Application_Idle(object sender, EventArgs e)
{
    // Update the explorer's menuitems
    team.UpdateMenu();

    // Update display toolbars.
    team.UpdateToolBar();

    // Update SaveAll
    SaveAll.Enabled = teaj.IsModified;

    Up.Enabled = team.CanNavigateUp;
    ...
4

1 に答える 1

29

まず、Application.Idleは「スレッドアイドル」ではなく、アプリケーションのUIスレッドでのメッセージ処理に関するものであることを理解してください。(スレッドアイドルはメッセージループアイドルとは異なります)

WinFormsアプリは、メッセージをキューから引き出すメッセージループによって駆動されます。そのキューが空になると、メッセージループはクワイエット状態になり、次のメッセージがメッセージキューに表示されるまで効率的にスリープします。これは、CPU処理リソースを節約するのに役立ち(ループで回転する無駄なサイクルは、マシンで実行されている他のプロセスからCPU時間を奪うため、すべてが遅く感じられます)、消費電力の削減/ラップトップのバッテリー寿命の延長にも役立ちます。

通常、アプリのメッセージループは、編集ボックスに入力しているときのキーストロークの間であっても、メッセージキューのバックログをかなり頻繁に使い果たします。

Application.Idleイベントは、複数のスレッドに関与することなく、アプリの主要な操作とは非同期にアプリケーションのハウスキーピングの雑用を処理するのに便利な場所になりました。

メニューとボタンは通常、たとえばアプリケーションがアイドル状態になったときに、対応するコマンドの状態に一致するように有効または無効になります。表示される外観はユーザー時間でのみ更新する必要があるため(ユーザーは、数ミリ秒後の視覚状態の変更と比較して、内部状態の変更時に視覚状態の変化の違いを正確に識別できません)、アプリケーションのアイドルイベントは次のようになります。そのような家事の雑用の世話をするための簡単で効果的な機会。

WinformsアプリのApplication.Idleにコードを挿入して、データベースまたはネットワークリソースを確認できます。ただし、Application.Idleをブロックすると、アプリのUI全体がフリーズするため、「長い時間」かかることは行わないように注意する必要があります。通話をブロックする代わりに、非同期通話を使用します。

また、Application.Idleイベントが発生する速度は非常に変動することに注意してください。ユーザーとアプリケーションの動作に応じて、1秒間に数回発生する場合と、数秒間発生しない場合があります。定期的にデータの更新を確認する場合は、Application.Idleの代わりにタイマーイベントを使用する必要があります。Application.Idleが起動するたびに非同期ネットワーク要求を開始すると、1秒あたりの(冗長な)要求がサーバーに大量に発生する可能性があります。

于 2011-03-24T06:08:11.390 に答える