私は過去 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 と何か関係があるのではないかと疑っています。
そして、そこに通常のロックをかけると、問題は解決しましたが、それについても答えがありません。非静的メンバー関数をロックする必要があるのはなぜですか?
誰でも私にこれに対する答えを教えてもらえますか。私はグループの新人です。質問に何か欠けている場合はお知らせください。クライアントの制限があるため、コード全体をコピーすることはできません。読んでくれてありがとう。