質問: dv のようにバインドしています。
回答: 順番に説明します。 [前回] [DataGridView.Refreshなどの処理の件] 前回の回答で、 おはよう おはよう おはよう おはよう おはよう こんにちは において、「おはよう」表示に該当するのが、 「DataGridViewへのユーザーの直接操作(書き込み操作)」 等であると説明しました。 その他にも、メインスレッドで行なわれる処理が、上記例での「おはよう」表示に該当します。 もちろん、前回の補足で書かれているDataGridView.Refreshなどの処理も、上記例での「おはよう」表示に該当します。 すなわち、DataGridView.Refreshなどのメインスレッドでの処理が終わるまでは、通信処理用スレッドからのデーター書き込みを行なえません。 すなわち、「一応コントロールには、Invoke() メソッドを用意していますが、それでスレッド間通信が無理な場合は、スレッド作成の技法で、マルチスレッドに対応する仕組みを作って下さい」と言う仕様になっています。 [コントロールのマルチスレッド対応/非対応] 各種のコントロールには、Invoke()メソッドが用意されているので、コントロールはマルチスレッド対応していると思う人が多いと思います。 しかし、大半のコントロールは、マルチスレッドに対応した設計になっていません。 少なくとも、テキストボックス等のよく使われるコントロールの多くは、マルチスレッドに対応していないです(簡易的なマルチスレッド対応になっている)。 もしも、各種コントロールを、マルチスレッド対応で設計する場合は、他スレッドからのアクセスの受け付け処理を、ループで繰り返して行なう必要があります。 すなわち、受け付けをループで常時行ないます(メッセージループのイメージ)。 ただし、全てのコントロールが、上記のようなマルチスレッド対応の設計が行なわれていたら、プログラム全体の処理が重くなります。 そこで、多くのコントロールが、前回や今回で説明したような簡易的なマルチスレッド対応になっています。 すなわち、メインスレッドでの各処理が終わったタイミングで、別スレッドからのアクセスが可能になっていると言う設計になっています。 [エラーとなる場合とならない場合がある件] 本質問で書かれているDataTable.ImportRow(row)では、インポート用の機能なので、マルチスレッド対応の設計がされている可能性があります。 よって、エラーにならなかったのだと思います。 いずれにせよ、今の処理方法の場合では、「有効ではないスレッド間の操作」と言うエラーが出ているので、コントロールに用意されているスレッド機能( DataGridView.Invoke )では無理のようです。 よって、正規のマルチスレッドプログラミングで、マルチスレッド対応の仕組みを作る必要があります。 その方法は、前回での[スレッドの非同期呼び出しを行なう場合]で記した通りです。