TextBoxのLostFocusで非同期プロセスを呼び出すアプリケーションで問題が発生すると、非同期プロセスはメインフォームUIを更新する必要があります(またはダイアログを表示する必要があります)メインフォームのUIから)非同期に実行します。他のスレッドからUIを更新する
私たちはコールバックについて考えてきましたが、それは本当に非同期ですが、正しい順序で実行するためにはすべてが必要です。これは、データ入力の速度と正確さが重要なデータ入力システム用です。
例のコードは、何をしようとしているのかを示しています。BeginInvokeに切り替えると、処理の順序が正しくありません。
パブリック・クラスのForm1
Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus
' execute the server subroutine
Dim dlgt As New MethodInvoker(AddressOf Me.AsyncProcess)
TextBox1.Text = "1"
' textbox should say 1
' call the server subroutine asynchronously, so the main thread is free
Dim ar As IAsyncResult = dlgt.BeginInvoke(Nothing, Nothing)
While ar.IsCompleted = False
' Application.DoEvents()
End While
' textbox should now say 2
TextBox1.Text = "3"
' textbox should now say 3
End Sub
Public Sub AsyncProcess()
UpdateTextBox()
End Sub
Public Sub UpdateTextBox()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf UpdateTextBox), "2")
Else
TextBox1.Text = "2"
End If
End Sub
エンドクラス
は、誰もが、我々はLostFocusイベントを処理している間はまだ忙しいですメインフォームのスレッドで何かを呼び出すことができる方法を知っていますか?
ありがとうございます。
このコードはDoEventsなしでデッドロックしますが、UIスレッドがIsCompletedで回転している間にInvoke()呼び出しを完了できません。 BeginInvoke()を代わりに使用すると、 "3"の後に常に "2"が表示されます。コードは、代替案を提案するにはあまりにも不思議です。 –
なぜ2を表示するのに気をつけますか? 3はほぼ即座に消去します。 – GameAlchemist
@ Vincent Piel - 彼はバックグラウンドスレッドからUIを更新できるようにしたいと考えていると思うので、特定の順序で何かが起こることを望んでいます。 –