等待/异步跨线程调用?
问题描述:
我正在学习异步/等待,并试图将它们合并到我的代码中,因为某些操作对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
,因为这又是另一类,引发跨线程异常...
我该怎么办?
答
您需要从您的UI元素中划分出您的背景。
尤其是,您当前将DataTable
,DataGridView
和ToolStripButton
传递到Task.Run
内调用的方法中。您不应该将像DataGridView
和ToolStripButton
这样的UI元素发送到一个单独的线程中。
相反,有你的后台线程只有填写DataTable
,然后让UI线程使用这些数据来操纵DataGridView
和ToolStripButton
。
是的,你打电话给'Task.Run',这样就会在非UI线程上执行'PopulateGrid'。你应该很小心地使'PopulateGrid'成为一个异步方法 - 然后从'Populate'调用它。 –
您应该从UI获取数据,等待处理数据的后台函数,然后用'Populate'中的结果更新UI。目前你的背景功能触及UI中太多必须修改的东西。 –
我这样做了,我明白我必须在'dgv.DataSource = query'位上放置'Await Task.Run'?它引发'dgv'上的异常,因为它来自Form1 ... – AwonDanag