Если вы новичок в программировании, это может немного сбить с толку, но ответ состоит в том, чтобы вставить код из обработчика событий Load
Form3
в метод Async
и дождаться его.Ваш пользовательский интерфейс зависает, потому что вы выполняете работу синхронно в потоке пользовательского интерфейса.Вам нужно либо явно использовать вторичный поток, либо использовать Async
/ Await
.Это:
Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Do some work.
End Sub
станет следующим:
Private Async Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Await DoWork()
End Sub
Private Async Function DoWork() As Task
Await Task.Run(Sub()
'Do some work.
End Sub).ConfigureAwait(False)
End Function
На самом деле это, вероятно, более сложно, чем необходимо, и это должно работать нормально:
Private Async Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Await Task.Run(Sub()
'Do some work.
End Sub).ConfigureAwait(False)
End Sub
Перечитаввопрос, что вам, вероятно, нужно сделать, это чтобы ваш асинхронный метод был функцией, которая извлекает и возвращает данные с веб-страницы или чего-либо еще, а затем вы затем загружаете эти данные в DataGridView
синхронно, например,
Private Async Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataGridView1.DataSource = Await GetDataAsync()
End Sub
Private Async Function GetDataAsync() As Task(Of DataTable)
Return Await Task.Run(Function()
Dim table As New DataTable
'Populate table here.
Return table
End Function).ConfigureAwait(False)
End Function
Таким образом, метод GetDataAsync
возвращает Task(Of DataTable)
, то есть Task
, который асинхронно выполняет функцию, которая возвращает DataTable
.В обработчике события Load
вы вызываете этот метод и ожидаете Task
, что означает, что ваш код будет ждать, пока Task
не выполнит и не вернет свои данные, но без блокировки потока пользовательского интерфейса, как в случае синхронного вызова.Синхронный эквивалент будет следующим:
Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataGridView1.DataSource = GetData()
End Sub
Private Function GetData() As DataTable
Dim table As New DataTable
'Populate table here.
Return table
End Function