7

DataTable複数のスレッドからにアクセスしているとします。特定の行にアクセスしたい場合は、その操作をロックする必要があると思います (これについては間違っている可能性がありますが、少なくともこの方法で安全であることはわかっています)。

// this is a strongly-typed table
OrdersRow row = null;
lock (orderTable.Rows.SyncRoot) {
    row = orderTable.FindByOrderId(myOrderId);
}

しかし、その行を更新したい場合は、テーブル (またはテーブルのRows.SyncRootオブジェクト)を再度ロックする必要がありますか、それとも単純に行をロックできますか?

4

3 に答える 3

5

lock実際には、DataTable または DataRow の 1 か所でa を実行するだけでは、実際に何も起こりません。Monitorロック (ブロックとは何か)を使用する際に覚えておくべき重要な側面lockは、オブジェクトをロックしても何も起こらないということです。これは、リソース自体をロックするのではなく、専用のロック オブジェクトを使用することを推奨する理由の 1 つです。これは、リソースを扱うときはいつでも (同じオブジェクトに対して) ロックを実行する必要があることを認識しなければならないためです。

そうは言ってDataTableも、データ ストレージ自体がそこにあるため、全体をロックすることをお勧めします (オブジェクトには、データを取得する場所に関する へDataRowのオフセットのみが内部的に含まれています)。DataTableこのため、個々の行へのアクセスを同期したとしても、2 つの異なる行を同時に更新すると、同じデータ ストレージ メカニズムが同期されずに更新されることになります。

ここでは、内部型を「ブラック ボックス」と見なすことと、必要なものだけをロックすること (この場合、行のみをロックするという誤った結論につながる) と、内部の仕組みについて洞察を得ようとすることの間に矛盾があります。変更される可能性のある実装の詳細に依存しています。

要するに、現時点では全体DataTableをロックして、内部データ ストレージ システムが非同期に更新されないようにする必要があります。

于 2010-04-09T13:45:28.983 に答える
3

読み取りのためにロックする必要はありません-書き込み/更新のためだけです。データの一貫性を確保するために、できる限り最小量をロックします...通常、更新する行は1つだけです。テーブル間の親子関係を更新する場合は、各テーブルの各行をロックする必要があります。

于 2010-04-09T13:14:00.800 に答える
3

The datatable is only safe for multi threaded read operations:

http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e

On reading about the datatable there is conflicting information concerning the ability to lock the table and allow you to safely update data in a row. According to the second link you can lock the table and update the row. Being this is from a MS MVP, I would say that you probably can lock the table and be ok.

于 2010-04-09T13:15:55.523 に答える