我正在学习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
上,因为它再次出现在另一个类中,引发了一个跨线程异常......
我该怎么办?
答案 0 :(得分:0)
您需要将后台工作与UI元素分开。
特别是,您目前正在将DataTable
,DataGridView
和ToolStripButton
传递到从Task.Run
内部调用的方法中。您不应该将DataGridView
和ToolStripButton
等UI元素发送到这样的单独帖子中。
相反,让您的后台主题仅填写DataTable
,然后让UI线程使用该数据来操作DataGridView
和ToolStripButton
。