在过去的 4 年里,我一直在使用 c# 代码,但最近我经历了一个我从未经历过的场景。我有一个该死的项目来解决“索引超出范围错误”。代码看起来很疯狂,所有不必要的东西都在那里,但它已经投入生产了 3 年,我只需要解决这个问题。来到问题所在。
class FilterCondition
{
.....
public string DataSetName {get; set;}
public bool IsFilterMatch()
{
//somecode here
Dataset dsDataSet = FilterDataSources.GetDataSource(DataSetName); // Static class and Static collection
var filter = "columnname filtername"
//some code here
ds.defaultview.filter= filter;
var isvalid = ds.defaultView.rowcount > 0? true : false;
return isValid;
}
}
// from a out side function they put this in a parallel loop
Parallel.ForEach()
{
// at some point its calling
item.IsFiltermatch();
}
当我调试时,dsDataSet
我看到dsDataSet
修改了我的多个线程。这就是为什么会发生竞争条件并且它无法应用过滤器并且由于索引超出范围而失败。
我的问题是,我的方法是非静态和线程安全的,那么这种竞争条件是如何发生的,因为dsDataset
它是我的成员函数内的局部变量。奇怪,我怀疑与 Parallel.Foreach 有关。
当我在那里放一个普通锁时,问题得到了解决,为此我也没有答案。为什么要锁定非静态成员函数?
谁能给我一个答案。我是小组的新手。如果我在问题中遗漏任何内容,请告诉我。由于那里的客户限制,我无法复制整个代码。谢谢阅读。