Я изучаю async/await и пытаюсь включить их в свой код, поскольку некоторые операции оказывают незначительное влияние на пользовательский интерфейс.Await/Async Перекрестные потоки?
В классе Form1 у меня есть:
Private Async Sub Populate(sender As Object, e As EventArgs)
Await Task.Run(Sub() PopulateGrid(query, dgv, {Button1, Button2}))
End Sub
PopulateGrid
находится в другом классе, наряду с аналогичными методами:
Public Shared Sub PopulateGrid(query as DataTable, dgv as DataGridView, menuButtons() as ToolStripButton)
Try
dgv.DataSource = query
...
...
Finally
SetMenuButtonStates(dgv.CurrentRow IsNot Nothing, menuButtons)
End Try
End Sub
Ошибка на SetMenuButtonStates
, так что снова находится в другом классе , поднимая исключение поперечной нити ...
Что мне делать?
Ну да, вы вызываете 'Task.Run', так что это будет выполнение' PopulateGrid' в потоке, отличном от UI. Вероятно, вы, скорее всего, сделаете «PopulateGrid» асинхронным методом - осторожно, а затем просто назовите его «Populate». –
Вы должны захватить данные из пользовательского интерфейса, ждать функции фона, которая обрабатывает данные, а затем обновлять пользовательский интерфейс с результатами в 'Populate'. В настоящее время ваша фоновая функция затрагивает слишком много вещей в пользовательском интерфейсе, которые необходимо изменить. –
Я сделал это, и я понимаю, что мне нужно поставить 'Await Task.Run' на бит' dgv.DataSource = query'? Это вызывает исключение на 'dgv', так как оно из Form1 ... – AwonDanag