2

我正在帮助修饰一个应用程序,它充满了并发问题。我正在尝试解决它们,并遇到了使用 DataTables 的部分。

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

我知道使用 dt.Select("...") 本身需要一个 lock 语句,否则在向数据表添加/删除行时会遇到问题。但是,当该调用返回时,您将拥有一个 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
    }
}
4

1 回答 1

1

由于您声明将更新现有行,因此您别无选择,只能锁定对从中提取的行的访问Select。如果有可能它们可以被另一个线程修改,您不能(或至少不应该)访问这些行,即使只是读取。此外,访问单个行可能会触及底层DataTable的内部结构(我自己也看到过传闻证据),因此即使您只是添加新行,仍然可能存在问题。

于 2010-10-05T19:40:39.520 回答