使用する必要性は何Application.DoEvents
ですか?いつ使用する必要がありますか?
3 に答える
Application.DoEvents
通常、UI スレッドで長時間実行される操作を実行しているときに、イベントが定期的に処理されるようにするために使用されます。
より良い解決策は、そうしないことです。UIを更新する必要がある場合は、個別のスレッドで長時間実行される操作を実行し、UI スレッドに ( Control.BeginInvoke
/Invoke
または を使用して) マーシャリングします。BackgroundWorker
Application.DoEvents
再入可能性の可能性を導入し、非常に理解しにくいバグにつながる可能性があります。
Windowsは、クリック、サイズ変更、閉じるなどのさまざまなイベントを保持するためのキューを維持します。コントロールがイベントに応答している間、他のすべてのイベントはキューに保持されます。そのため、アプリケーションがボタンクリックの処理に過度に時間がかかる場合、アプリケーションの残りの部分がフリーズしているように見えます。その結果、イベントに応答して重い処理を実行しているときに、アプリケーションが応答しないように見える可能性があります。UIがフリーズしないように、非同期で大量の処理を行うのが理想的ですが、すばやく簡単な解決策は、Application.DoEvents()を定期的に呼び出して、保留中のイベントをアプリケーションに送信できるようにすることです。
優れたWindowsアプリケーションの場合、エンドユーザーは、より大きな/重い操作を実行しているときに、任意の形式のアプリケーションがフリーズすることを好みません。ユーザーは、UIをフリーズさせるのではなく、アプリケーションをスムーズかつ応答性の高い方法で実行することを常に望んでいます。しかし、グーグルした後、Application.DoEvents()をアプリケーションで頻繁に使用するのは適切ではないことがわかりました。そのため、代わりにこのイベントでは、ウィンドウをフリーズせずに長時間実行するタスクを実行するためにBackGroundワーカースレッドを使用することをお勧めします。
実際に見てみると、より良いアイデアが得られます。次のコードをコピーして、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
非常に予期しない動作が発生する可能性があるため、決して使用しないでください。生成されたコードだけでOKです。ユーザーがキーを 2 回押したなどの理由で、現在のイベント ハンドラーを再度実行している場合などです。コントロールを更新して現在のプロセスを表示する場合は、Application を呼び出す代わりに、そのコントロールで .Update を明示的に呼び出す必要があります。 .DoEvents.