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
でありますクロススレッド例外を発生させます...
私は何をしますか?
さて、あなたは 'Task.Run'を呼び出しているので、UI以外のスレッドで' PopulateGrid'を実行します。代わりに 'PopulateGrid'を非同期メソッドにして、' Populate'から呼び出すだけで十分です。 –
あなたはUIからデータを取得し、データを処理するバックグラウンド関数を待ってから、Populateの結果でUIを更新する必要があります。現在のところ、バックグラウンド関数はUIで変更する必要のある項目が多すぎます。 –
私はそれを行い、 'Await Task.Run'を' dgv.DataSource = query'ビットに置く必要があることを理解していますか?それはForm1からのものであるので、 'dgv'の例外を発生させます... – AwonDanag