c# - 数据表并发锁定

标签 c# concurrency datatable datarow

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

数据表本身是静态的,在多个线程之间共享。

我知道使用 dt.Select("...") 本身需要一个锁定语句,否则在向数据表中添加/删除行时会遇到问题。但是,当该调用返回时,您将拥有一个 DataRow 对象数组。

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

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

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

lock (dtLock)
{
    DataRow[] rows = dt.Select("...");

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

最佳答案

既然您声明您将更新现有行,那么您别无选择,只能锁定对您从 Select 中提取的行的访问。你不能(或至少不应该)访问这些行,即使只是读取,如果它们有可能被另一个线程修改的话。此外,访问单个行可能会触及底层 DataTable 的内部结构,因此即使您只是添加新行,那里仍然可能 是个问题。

关于c# - 数据表并发锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3867002/

相关文章:

c# - 如何在调试器或控制台中输出所有小数位的 double 值

c# - 在 C# 中实现与 CTime.GetTime() 方法相同的行为

c# - 如何在Monodevelop中插入自动完成模板

multithreading - 你能为线程指定一个非静态的生命周期吗?

jquery - 无法仅在数据表中的灰色行中更改 td 的背景颜色

c# - 如何允许在 asp.net 的文本框中提交 HTML 标记?

multithreading - Clojure async/go 如何停放阻塞代码

c++ - 带引用计数的无锁堆栈

c# - DataView 的 RowFilter 用于对象类型的 DBNull 值

c# - 在 DataSet 中使用函数时为 "undefined function call"