Application.DoEvents
を使用する必要性と使用する時期は何ですか?Application.DoEvents、必要なとき、そうでないときは?
答えて
Application.DoEvents
は、通常、UIスレッドで長時間実行される操作を実行しているときにイベントが定期的に処理されるようにするために使用されます。
もっと良い解決策はそれをしないことです。別のスレッドで長時間実行する操作を実行し、UIを更新する必要がある場合は、UIスレッド(Control.BeginInvoke
/Invoke
またはBackgroundWorker
)にマーシャリングします。
Application.DoEvents
には再入可能性があり、非常に分かりにくいバグにつながる可能性があります。
非常に予期しない動作に終わる可能性があるので、使用することは決して避けてください。 ちょうど生成されたコードはOKです。あなたのようなものは、現在のイベントハンドラを再度実行しています。ユーザーがキーを2回押したなどのためです。 現在のプロセスを表示するためにコントロールをリフレッシュする場合は、呼び出す代わりにそのコントロールの.Updateを明示的に呼び出す必要がありますApplication.DoEvents。
Windowsは、クリック、サイズ変更、閉じるなどのさまざまなイベントを保持するキューを保持します。コントロールがイベントに応答している間は、他のすべてのイベントがキューに保持されます。したがって、アプリケーションがボタンクリックを処理するのに時間がかかり過ぎると、残りのアプリケーションがフリーズするように見えます。したがって、イベントに応答して処理が多少行われている間に、アプリケーションが応答しなくなる可能性があります。理想的には、UIがフリーズしないように非同期で処理するのが理想的ですが、Application.DoEvents()を定期的に呼び出すだけで、保留中のイベントをアプリケーションに送ることができます。
優れたWindowsアプリケーションの場合、大/大重量の操作を実行しているときにアプリケーションのいずれかのフォームがフリーズしても、エンドユーザーは好きではありません。ユーザーは常にUIをフリーズするのではなく、スムーズに応答してアプリケーションを実行したいと考えています。しかし、私はグーグルで私はApplication.DoEvents()は、アプリケーションでより頻繁に使用する良い習慣ではないことが判明したので、このイベントの代わりに、BackGround Worker Threadを使用してウィンドウをフリーズせずに長時間実行するタスクを実行することをお勧めします。
実際に見た方が良いアイデアを得ることができます。次のコードをコピーして、Application.DoEvents()を置くかどうかでアプリケーションをチェックしてください。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
For i As Integer = 0 To 1000
System.Threading.Thread.Sleep(100)
ListBox1.Items.Add(i.ToString())
Application.DoEvents()
Next
End Sub
- 1. MySQL - 変数をエスケープする必要があるときとそうでないときは?
- 2. ブロックバックグラウンドワーカーとApplication.DoEventsで
- 3. なぜ我々はanalysis_portが必要なときにanalysis_exportを必要とする
- 4. HashMap:containsKey()それが必要なときは真ではありませんか?
- 5. Rubyは ` 'が必要です。そのようなファイル(とLoadError)をロードすることはできません
- 6. iPad/iPhoneで必要なときに2回のクリックが必要
- 7. はそのようなelemntsは、私は助けを必要と
- 8. ` 'が必要です。そのようなファイルをロードすることはできません - ペーパークリップ/マッチャ(とLoadError)
- 9. mvc3 .net控えめなJavascript - ときどき動作するが、必ずしもそうではない
- 10. 注釈:arrayOfが必要なとき
- 11. ダックタイピング - 具体的なタイプが必要なときはどうですか?
- 12. アクチベータクラス/ "Bundle-Activator"がプラグインに必要な場合とそうでない場合
- 13. ダイナミックJSページで必要なときにのみ必要なコンテンツをレンダリングする
- 14. `必要 ':そのようなファイルをロードすることはできません - FFI(とLoadError)`が必要です':そのようなファイルをロードすることはできません - FFI(とLoadError)レールコンソールに
- 15. 私はそれが必要ではないときにコードのループ、タイトルで説明するのは難しい
- 16. 酵素シミュレーション「クリック」が必要なときに機能しない
- 17. Rubyの宝石は、それを必要とすることができないが
- 18. requirejs - 必要なときではなく、モジュールが定義されているときに構築する
- 19. Python TypeError( "str"ではなく、バイトのようなオブジェクトが必要です)。インポートが見つからないとき
- 20. ` 'が必要です。そのようなファイルをロードすることはできません - レール/
- 21. ActiveMQはディスク上で必要なときだけ持続する
- 22. ちょうど必要なときにジャーをローディング
- 23. 目的Cいつallocを使うべきか、そうでないとき
- 24. Deree for Spree(Rails)をいつ使うべきか、そうでないときはどうなるのか?
- 25. Logstatshにログを送ることができるときにファイルビートが必要なのはなぜですか?
- 26. アドオンは、必要なファイルを変更できないというエラーでインストールすることはできません。
- 27. セレン:はNoSuchElementException:いいえ、そのような要素:要素を見つけることができません:
- 28. アプリケーションキャッシュは、ユーザーがそれを必要とするときだけですか?
- 29. どのように私はバックアップファイルを削除することができ、私はバックアップフィルスを必要としない
- 30. 私は必要がないときに別のものを使うべきですか?
Jon、 あなたはイベントが定期的に処理されることを確認すると言っています...どのイベントですか?順次プログラミングでは、フォーム上にボタンがあるとします。たとえば、ユーザーがクリックすると、フォームの不透明度が変わります... 今、ボタンのクリック以外はどのような種類のイベントがありますか? – odiseh
アプリケーションのコードが明示的にそれらのほとんどを処理していない場合でも、再描画、サイズ変更、マウスの動きなど、非常に多くのイベントがあります。 –
@JonSkeet 'DoEvents'の有効な使用方法に関するご意見をお待ちしております。 https://stackoverflow.com/questions/45023826/is-this-a-valid-use-of-doevents-sample-project-included –