2016-11-21 156 views
0

我正在学习异步/等待,并试图将它们合并到我的代码中,因为某些操作对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

是的,你打电话给'Task.Run',这样就会在非UI线程上执行'PopulateGrid'。你应该很小心地使'PopulateGrid'成为一个异步方法 - 然后从'Populate'调用它。 –

+0

您应该从UI获取数据,等待处理数据的后台函数,然后用'Populate'中的结果更新UI。目前你的背景功能触及UI中太多必须修改的东西。 –

+0

我这样做了,我明白我必须在'dgv.DataSource = query'位上放置'Await Task.Run'?它引发'dgv'上的异常,因为它来自Form1 ... – AwonDanag

回答

0

您需要从您的UI元素中划分出您的背景。

尤其是,您当前将DataTableDataGridViewToolStripButton传递到Task.Run内调用的方法中。您不应该将像DataGridViewToolStripButton这样的UI元素发送到一个单独的线程中。

相反,有你的后台线程只有填写DataTable,然后让UI线程使用这些数据来操纵DataGridViewToolStripButton