【发布时间】:2021-01-03 06:08:58
【问题描述】:
为什么下面的代码会随机向DataRow对象写入空值?
ConcurrentDictionary<long, DataRow> dRowDict = new ConcurrentDictionary<long, DataRow>();
foreach (long klucz in data.Keys)
{
DataRow row = table.NewRow();
dRowDict.TryAdd(klucz, row);
}
Parallel.ForEach(data.Keys, klucz =>
{
Dane prz = data[klucz] as Dane;
DataRow dr = dRowDict[klucz];
foreach (PropertyDescriptor prop in llProp)
{
dr[prop.Name] = prop.GetValue(prz) ?? DBNull.Value;
}
});
foreach (DataRow dRow in dRowDict.Values)
{
table.Rows.Add(dRow);
if (dRow["FILED"] == DBNull.Value)
{
MessageBox.Show("ERROR...NULL VALUE"); //why this happen?
}
}
普通的 for 循环不会导致这个问题 - 为什么,我的错误在哪里?
我的问题是 - 我可以在并行循环中修改任何对象的属性吗?
Parallel.ForEach(myData.AsEnumerable()..., value =>
{
Object x = new Object(); // or x = dict[key];
x.A = ...;
x.B = ...; //Can I do this and is it safe?
}
【问题讨论】:
-
DataTable 不是线程安全的。问题不在于
Parallel.ForEach。此外,Parallel.ForEach用于数据并行,即处理大量数据。它通过对输入进行分区并让专门的工作人员处理分区来做到这一点。您的代码所做的与它完全不同。它只是修改了一些 DataRows。你想做什么,为什么需要并行处理? -
Parallel.Foreach将列表视为无序,因此它没有任何顺序运行。 -
@RomanRyzhiy 这并不完全正确 - 分区中的数据是有序的,但不是故意的。
-
这段代码试图解决什么问题?为什么要提前创建行,而不是在创建时填充它们?
标签: c# foreach parallel-processing datarow