0

私は過去 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 と何か関係があるのではないかと疑っています。

そして、そこに通常のロックをかけると、問題は解決しましたが、それについても答えがありません。非静的メンバー関数をロックする必要があるのはなぜですか?

誰でも私にこれに対する答えを教えてもらえますか。私はグループの新人です。質問に何か欠けている場合はお知らせください。クライアントの制限があるため、コード全体をコピーすることはできません。読んでくれてありがとう。

4

3 に答える 3