过去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有关。
当我把普通锁定放在那里时,问题得到了解决,因为我也没有答案。为什么要锁定非静态成员函数?
任何人都可以给我一个答案。我是小组的新手。如果我遗漏了问题中的任何内容,请告诉我。由于客户端的限制,我无法复制整个代码。谢谢你的阅读。
答案 0 :(得分:1)
问题:问题在于此次调用
FilterDataSources.GetDataSource(DataSetName);
在此方法中,您将写入共享的资源。
<强>解决方案:强>
您需要知道这里写的是哪个字段,并且需要对其进行锁定。
注意:如果您可以发布上述方法的代码,我们可以更好地为您提供帮助。