У нас есть проблема с приложением, когда мы выполняем вызов асинхронного процесса на LostFocus в TextBox, тогда асинхронный процесс должен иметь возможность обновлять основной интерфейс формы (или отображать диалоговое окно из основного интерфейса формы). ) при асинхронном запуске.
Мы думали о обратных вызовах и о том, что они действительно асинхронные, но нам нужно, чтобы все выполнялось в правильном порядке, и это для системы ввода данных, где важна скорость и точность ввода данных.
Пример кода показывает, что мы пытаемся сделать, и если вы переключитесь на 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?
Спасибо заранее.