1

.net 3.5データテーブルを使用しており、複数のスレッドからデータテーブルに行を追加しています。ロックを使用しない場合、datatablrの行数と最大インデックスの間に不一致が発生します。テーブルをシリアル化しようとすると、例外が発生しますthere is no rows at poitions X。もちろん、データテーブルをロックすることはできますが、原因を知りたいのですが。row.count()このメソッドは、独立していないカウンターではなく、行の最大インデックス+1に基づいて返されることを期待します。rows.Addまた、 (params)メソッドの内部実装はどこにありますか?soemの場合、追加が同じ行にある場合でも、追加ごとにカウンターが上がるようです。

編集:コメントをありがとう。私はそれが書き込みに対してスレッドセーフではないことを知っており、syncrootオブジェクトのロックを使用してすでにそれを解決しています。addメソッドの内部で何が起こっているのかを確認して、カウントが混乱する場所を確認したいと思います。

4

1 に答える 1

4

原因は単純です:DataTableスレッドセーフではありません。(競合する書き込みに対して) スレッドセーフであるとは主張せず、スレッドセーフである必要もありません。ほとんどのコードはスレッド セーフではありません。「次のシナリオではスレッド セーフです」と明記されていない限り、スレッド セーフではないと想定する必要があります

最も一般的には、このシナリオでは、次のいずれかを意味します。

  • インデックスの更新が失われています。つまり、両方がcount++同時に実行されており、1 だけ上昇しています。
  • 配列がコピー、拡大、縮小、または再配置されている場合、操作によりクレイジーなデータが生成されます

修正は簡単です。スレッドがテーブルを変更している場合は、排他アクセスが必要です。だから同期する。lockが最も簡単なオプションですが、よりエキゾチックなオプションがReaderWriterLockSlim存在します。

次に、次のステップは決定することです:本当に使いたいDataTableですか?

于 2012-09-21T13:11:30.960 に答える