2016-11-21 256 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