2017-12-12 13 views
0

こんにちは私はいくつかのテーブルを含むデータセットを持っています。 これらのテーブルの1つはバインディングソースにバインドされています。このバインディングソースは、次にdatagridviewにバインドされています。それは、HTTP他のスレッド経由でdatagridviewにバインドされたdataset.datatableを更新するには

を介してデータを取り込むように、データセットテーブルは、単一のバックグラウンドスレッドを介して更新される

これは明らかにそれが別のスレッドから更新されるように、クロススレッドエラーをスローするのDataGridViewを引き起こします。

私の質問は、完全に書き直すことなくこれを回避する方法です。バックグラウンドスレッドが作成する何らかのバッファからデータセットを更新するUIスレッドを持つことができたことに気がつきましたが、もう一度やり直しています。私が見逃した簡単な方法はありませんか?私がここで見ている例のほとんどは、私が再び始める必要があるように思えます。

答えて

1

私はあなたがasync/awaitを使用していないと仮定しています。

Invoke()を使用すると、UIスレッドで何かを実行できます。

Task.Run(new Action(() => 
{ 
    // << do http call >> 

    this.Invoke(new Action(() => 
    { 
     //manipulate grid here..... 
    })); 
})); 

理想的には、async/awaitを使用しています。 Task.RunでIOバウンドコードを実行するのは無駄です。

+0

あなたは '新しいアクション'を作成する必要はありません。これを行うことができます: 'Task.Run(()=> ...);' – VMAtm

+0

@VMAtm良い点。私はコンパイル時に同じになると思うが、簡潔にする方が良い。 – Crowcoder

+0

あなたは正しいですか?非同期/待機を使用していません。私はこのメソッドを試してみたことがなかった。別のスレッドと同じエラーが出るだろうと推測したからだ。 また、Invokeを使用して、データセット操作のものをUIスレッドに戻すように見えますが、UIスレッドはロックアップされ、応答がなくなります。データの処理時間が原因です。私は見直しをして、見た目でこれをやり直さなくてはなりません。 – JohnFrendras

関連する問題