2

私が取り組んでいるプロジェクトでは、いくつかのデータを表示する DataGridView コンポーネントの束を含むフォームがあります。すべての DataGridView には、関連付けられた独自の DataTable があります。表示するデータは定期的に送信されます。私のアプリケーションは、このデータを読み取って解析し、それに応じてデータグリッドを埋める必要があります。フォームの応答性を維持したいので、エンドレス バックグラウンド ワーカーでデータの受信 (ブロッキング) を実装しました。

バックグラウンド ワーカーでデータを取得し、それを解析して DataTable に収まる値に変換します。ここで質問です。現時点では、これらの値を DataTable オブジェクトに直接割り当てています。(だから私はバックグラウンドワーカーの DoWork イベント内からこれを行います)

これが有効かどうか疑問に思っています。インデックスの範囲外の例外が一度ありましたが、これが何らかの形でこれに関連しているのかどうか疑問に思っていました。これは安全で推奨される方法ですか?それとも、バックグラウンド ワーカーの DoWork イベントで呼び出しを使用して DataTables を更新する必要がありますか?

4

3 に答える 3

3

いいえ、コントロールのレンダリングに影響を与える.NET WinFormコントロールのすべてのプロパティ(これは前提条件です)(レンダリングに影響を与えるコントロールにバインドされた値を含む)は、コントロールを作成したスレッドで作成する必要があります。

とはいえ、変更を加えることができなくなることがよくありますが、動作は予測できないため、お勧めできません。

特定のケースでは、処理スレッドが動作するのコピーを用意し、そのコピーをUIスレッドにマーシャリングして(クラスが実装するインターフェイス実装DataTableの1つを呼び出すことにより)、グリッドを更新することをお勧めします。 UIスレッドで。ISynchronizeInvokeControl

DataTable基本的に、バックグラウンドスレッドからマーシャリングされたコピーを使用して、グリッドがバインドされているの更新を実行します。

于 2012-07-11T14:35:25.060 に答える
0

UI以外のスレッドからUIにバインドされた要素を更新してはいけないと言っても過言ではありません。多くの場合、例外が表示されない場合がありますが、これは決して良い習慣ではなく、例外やさらに悪いことに、目に見えないエラーにつながることがよくあります。

于 2012-07-11T14:35:12.273 に答える
0

うーん、ダメ。バックグラウンド スレッドで計算を行うことは非常に良い考えですが、UI の更新は常に UI スレッドで行う必要があります。

Datatable を UI 要素にバインドする場合、これらのオブジェクトの所有権を UI スレッドに「付与」し、バックグラウンド スレッドでそれらを更新しないようにする必要があります。

于 2012-07-11T14:31:19.570 に答える