Await / Async跨线程调用?

时间:2016-11-21 08:52:40

标签: vb.net asynchronous async-await

我正在学习async / await,并试图将它们合并到我的代码中,因为某些操作会对UI产生轻微或显着的影响。

在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 个答案:

答案 0 :(得分:0)

您需要将后台工作与UI元素分开。

特别是,您目前正在将DataTableDataGridViewToolStripButton传递到从Task.Run内部调用的方法中。您不应该将DataGridViewToolStripButton等UI元素发送到这样的单独帖子中。

相反,让您的后台主题填写DataTable,然后让UI线程使用该数据来操作DataGridViewToolStripButton