У нас есть проблема с приложением, в котором мы вызываем асинхронный процесс на LostFocus в TextBox, асинхронный процесс должен иметь возможность обновлять интерфейс основной формы (или отображать диалог из основного интерфейса UI) во время работы асинхронно.Обновление пользовательского интерфейса из другого потока
Мы думали о обратных вызовах и имели это по-настоящему асинхронное, но нам нужно все, чтобы выполнить в правильном порядке, и это для системы ввода данных, где важна скорость и точность ввода данных.
Пример кода показывает, что мы пытаемся сделать, и если вы переключитесь на BeginInvoke, порядок обработки неверен.
Public Class 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
End Class
Кто-нибудь знает, как мы можем ссылаться на что-то другое на главной форме нити, пока еще занят обработкой события LostFocus?
Заранее благодарен.
Этот код блокирует без DoEvents, вызов Invoke() не может завершиться, пока поток пользовательского интерфейса вращается на IsCompleted. Использование BeginInvoke() вместо этого всегда будет отображать «2» после «3». Код слишком таинственный, чтобы предложить альтернативу. –
Зачем беспокоиться о отображении 2 ?? 3 стирают его почти мгновенно. – GameAlchemist
@ Vincent Piel - Я думаю, он просто пытается проиллюстрировать, что он хочет обновить пользовательский интерфейс из фонового потока, и он хочет, чтобы все происходило в определенном порядке. –