2016-11-21 3 views
0

Я изучаю 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, так что снова находится в другом классе , поднимая исключение поперечной нити ...

Что мне делать?

+1

Ну да, вы вызываете 'Task.Run', так что это будет выполнение' PopulateGrid' в потоке, отличном от UI. Вероятно, вы, скорее всего, сделаете «PopulateGrid» асинхронным методом - осторожно, а затем просто назовите его «Populate». –

+0

Вы должны захватить данные из пользовательского интерфейса, ждать функции фона, которая обрабатывает данные, а затем обновлять пользовательский интерфейс с результатами в 'Populate'. В настоящее время ваша фоновая функция затрагивает слишком много вещей в пользовательском интерфейсе, которые необходимо изменить. –

+0

Я сделал это, и я понимаю, что мне нужно поставить 'Await Task.Run' на бит' dgv.DataSource = query'? Это вызывает исключение на 'dgv', так как оно из Form1 ... – AwonDanag

ответ

0

Вам нужно разделить фоновые работы с элементами пользовательского интерфейса.

В частности, вы в настоящее время прохождения DataTable, а DataGridView, и ToolStripButton в метод называется изнутри Task.Run. Вы не должны отправлять элементы пользовательского интерфейса, такие как DataGridView и ToolStripButton, в отдельный поток, подобный этому.

Вместо иметь свой фоновый поток только заполнить DataTable, а затем использовать нити UI, что данные манипулировать DataGridView и ToolStripButton.

Смежные вопросы