C# 数据表并发锁定

C# 数据表并发锁定,c#,concurrency,datatable,datarow,C#,Concurrency,Datatable,Datarow,我正在帮助整理一个应用程序,它充满了并发性问题。我正试图研究它们,遇到了一个使用数据表的部分 datatable本身是静态的,跨多个线程共享 我知道使用dt.Select(“…”)本身需要一个lock语句,否则在向数据表添加/删除行时会出现问题。但是,当该调用返回时,您有一个DataRow对象数组 如果我要更新这些行,我显然会锁定它们,但如果我只是在读取它们,它们需要锁定吗 基本上,考虑到我们在其他地方添加新行并可能更新现有行,以下哪项是正确的: lock (dtLock) { Data

我正在帮助整理一个应用程序,它充满了并发性问题。我正试图研究它们,遇到了一个使用数据表的部分

datatable本身是静态的,跨多个线程共享

我知道使用dt.Select(“…”)本身需要一个lock语句,否则在向数据表添加/删除行时会出现问题。但是,当该调用返回时,您有一个DataRow对象数组

如果我要更新这些行,我显然会锁定它们,但如果我只是在读取它们,它们需要锁定吗

基本上,考虑到我们在其他地方添加新行并可能更新现有行,以下哪项是正确的:

lock (dtLock)
{
    DataRow[] rows = dt.Select("...");
}
foreach(DataRow dr in rows)
{
    // read statements only
}


由于您声明将更新现有行,因此您别无选择,只能锁定对从
Select
提取的行的访问。如果行可能被其他线程修改,则不能(或至少不应该)访问这些行,即使只是读取。此外,访问单个行可能会触及底层的
数据表的内部结构,因此即使只是添加新行,也可能会出现问题。

。我也这么想,谢谢你访问这些行;我也很想知道,因为我认为DataTables跨行共享PK,等等。微软的网站说DataTables对于读取访问是安全的,如果行本身不安全的话,这真的意味着什么都没有。@jvenema:是的,它们对于多个读卡器来说绝对是安全的,但一旦你把一个编写器加入其中,一切都会改变。是的,我并不在乎这些记录是否过时,但是(例如)如果在运行时调用.Add(),select会抛出一个错误……这会导致问题:)
lock (dtLock)
{
    DataRow[] rows = dt.Select("...");

    foreach(DataRow dr in rows)
    {
        // read statements only
    }
}