gpt4 book ai didi

c# - 线程安全数据集

转载 作者:太空宇宙 更新时间:2023-11-03 19:23:36 27 4
gpt4 key购买 nike

我想对 DataTable/DataSet 进行线程安全的更新操作。有大约 20 个线程,每个线程使用 DataTable 的 Rows.Find(pk) 方法更新大约 40 行全局 DataTable。每个线程将更新 DataTable 的不同行。

我正在为 DataSet 使用以下包装器类。这种方法是线程安全的吗?

public sealed class MyDataSet{

public static DataSet ds = new DataSet();

public static UpdateRow(key,data)
{
object _lock = new object();
DataRow dr = ds.Tables[0].Rows.Find(key);
lock(_lock){
dr.AcceptChanges();
dr.BeginEdit();
dr["col"] = data;
dr.EndEdit();
}
}
}

此方法从 for 循环中调用。

for(int x=0; x<40; x++;){
if(someCondition)
.
.
.
MyDataSet.UpdateRow(key,data);
.
.
.
}

一切都在多线程环境中完成。 UpdateRow 方法线程安全吗?

最佳答案

不,这不安全。你应该改变你的代码:

public sealed class MyDataSet{

public static DataSet ds = new DataSet();

private static object _lock = new object();

public static UpdateRow(key,data)
{
lock(_lock){
DataRow dr = ds.Tables[0].Rows.Find(key);
dr.AcceptChanges();
dr.BeginEdit();
dr["col"] = data;
dr.EndEdit();
}
}
}

您的_lock 对象在您的程序中应该是一个静态对象,以使其成为一把好锁。而你的Find应该在锁定的部分。

关于c# - 线程安全数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10337474/

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