12

使用する必要性は何Application.DoEventsですか?いつ使用する必要がありますか?

4

3 に答える 3

17

Application.DoEvents通常、UI スレッドで長時間実行される操作を実行しているときに、イベントが定期的に処理されるようにするために使用されます。

より良い解決策は、そうしないことです。UIを更新する必要がある場合は、個別のスレッドで長時間実行される操作を実行し、UI スレッドに ( Control.BeginInvoke/Invokeまたは を使用して) マーシャリングします。BackgroundWorker

Application.DoEvents再入可能性の可能性を導入し、非常に理解しにくいバグにつながる可能性があります。

于 2009-07-12T06:25:01.827 に答える
2

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
于 2012-10-15T17:10:11.373 に答える
1

非常に予期しない動作が発生する可能性があるため、決して使用しないでください。生成されたコードだけでOKです。ユーザーがキーを 2 回押したなどの理由で、現在のイベント ハンドラーを再度実行している場合などです。コントロールを更新して現在のプロセスを表示する場合は、Application を呼び出す代わりに、そのコントロールで .Update を明示的に呼び出す必要があります。 .DoEvents.

于 2009-07-12T06:16:54.697 に答える