gpt4 book ai didi

c# - 如果我正在更新 DataRow,我是锁定整个 DataTable 还是只锁定 DataRow?

转载 作者:太空狗 更新时间:2023-10-29 20:08:54 29 4
gpt4 key购买 nike

假设我从多个线程访问一个DataTable。如果我想访问特定行,我怀疑我需要锁定该操作(我可能对此有误,但至少我知道这样我是安全的):

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

但是,如果我想更新该行,我是否应该再次锁定表(或者更确切地说,表的Rows.SyncRoot 对象),或者我可以简单地锁定该行吗?

最佳答案

实际上,只是执行一个 lock在 DataTable 或 DataRow 的一个地方实际上任何事。使用 Monitor 时要记住的一个重要方面锁(这就是 lock block )是锁定一个对象不会对它做任何事情;这就是一些人提倡使用专用锁定对象而不是锁定资源本身的原因之一,因为它会迫使您意识到无论何时处理资源都必须执行锁定(并且在同一对象上)。

也就是说,锁定整个 DataTable 是个更好的主意,因为数据存储本身就在那里(DataRow 对象在内部只包含一个到 DataTable 的偏移量,关于从哪里检索数据)。因此,即使您同步访问各个行,同时更新两个不同行也会导致您以非同步方式更新相同的数据存储机制。

将内部类型视为“黑盒”与仅锁定您需要的内容(在这种情况下,这会导致您得出仅锁定该行的错误结论)和试图深入了解之间存在冲突类型的内部工作和依赖的实现细节可能会改变

结果是,现在,您应该锁定整个 DataTable避免以非同步方式更新内部数据存储系统

关于c# - 如果我正在更新 DataRow,我是锁定整个 DataTable 还是只锁定 DataRow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2607661/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com