假设我访问来自多个线程DataTable。如果我要访问一个特定的行,我怀疑我需要锁定该操作(我可能是弄错了这一点,但至少我知道这样我很安全):

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

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

有帮助吗?

解决方案

其实,只需在数据表或DataRow的一个地方进行lock实际上没有的的东西。一个重要的方面在使用Monitor锁(这是一个lock块是什么)记住的是,锁定对象没有做任何事情,它;就是这样一些主张使用专用锁定对象,而不是锁定资源本身,因为它迫使你意识到你必须执行锁(与同一对象的)一个原因,每当你处理的资源。

这就是说,它是一个更好的主意锁定整个DataTable,作为数据存储本身是有(在DataRow对象内部只含有偏移量DataTable在何处检索数据)。正因为如此,即使你同步访问单独的行,更新两个不同行同时将导致你以非同步的方式更新相同的数据存储机制。

有冲突这里查看内部类型作为一个“黑匣子”,只需要(在这种情况下,会导致你的只有锁定该行有故障的结论)是什么锁,并试图洞察之间类型的内部工作,依靠实现细节的可能会改变

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

其他提示

只是写/更新 -

在不进行读取需要锁。锁定最小的量就可以了,保证数据的一致性...通常只是一列正在更新。如果要更新表之间的父/子关系,你需要锁定每一行中的每个表。

为多线程读取操作数据表仅是安全的:

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

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

在阅读有关数据表中没有关于锁定该表,并允许您安全地连续更新数据的能力矛盾的信息。根据第二个链接,您可以锁定表和更新行。作为这是从MS MVP,我会说,你大概可以锁定表和好的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top