2016-11-21 47 views
0

私はasync/awaitについて学習しており、一部の操作でUIに多少の重大な影響を及ぼすため、それらを自分のコードに組み込もうとしています。私はForm1クラスでAwait/Asyncクロススレッドコール?

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

私はそれを行い、 'Await Task.Run'を' dgv.DataSource = query'ビットに置く必要があることを理解していますか?それはForm1からのものであるので、 'dgv'の例外を発生させます... – AwonDanag

答えて

0

背景要素とUI要素を分割する必要があります。

特に、DataTableDataGridView、およびToolStripButtonTask.Runから呼び出されるメソッドに渡しています。あなたはDataGridViewToolStripButtonのようなUI要素をそのような別のスレッドに送るべきではありません。

代わりに、唯一はDataTableに必要事項を記入し、データがDataGridViewToolStripButtonを操作することをUIスレッドの使用を持っているあなたのバックグラウンドスレッドを持っています。