2

以前は WCSF 拡張プロジェクトの一部であり、その間に Unity に移行された古いバージョンの ObjectBuilder に問題があると思われます。私が正しい方向に進んでいるかどうかわからないので、これが問題になる可能性があるかどうかを説明する、より有能なスレッドセーフスキルを誰かが持っていることを願っています.

私は ASP.Net WCSF Web アプリでこの (時代遅れの) ObjectBuilder 実装を使用していますが、ObjectBuilder が何らかの理由でクラスの特定のプロパティを注入できないと不平を言っていることをログで確認することはめったにありません。問題は常に、このプロパティが絶対に注射してはいけません。プロパティとクラスは常に変化しています。プロパティが ObjectBuilder によって処理されるかどうかに関係なく、ディクショナリを使用して情報を保持するメソッドまでコードをたどりました。

私の質問は基本的に次のようになります: ObjectBuilder が辞書から一貫性のないデータを取得する可能性がある次のコードに、スレッドセーフの問題はありますか?

このコード (ReflectionStrategy.cs) を保持するクラスはシングルトンとして作成されるため、Web アプリケーションへのすべての要求はこのクラスを使用してビュー/ページ オブジェクトを作成します。そのディクショナリはプライベート フィールドであり、このメソッドでのみ使用され、次のように宣言されます。

private Dictionary<int, bool> _memberRequiresProcessingCache = new Dictionary<int, bool>();

private bool InnerMemberRequiresProcessing(IReflectionMemberInfo<TMemberInfo> member)
{
    bool requires;

    lock (_readLockerMrp)
    {
        if (!_memberRequiresProcessingCache.TryGetValue(member.MemberInfo.GetHashCode(), out requires))
        {
            lock (_writeLockerMrp)
            {
                if (!_memberRequiresProcessingCache.TryGetValue(member.MemberInfo.GetHashCode(), out requires))
                {
                    requires = MemberRequiresProcessing(member);
                    _memberRequiresProcessingCache.Add(member.MemberInfo.GetHashCode(), requires);
                }
            }
        }
    }
    return requires;
}  

上記のコードは、Codeplex で見つけることができる最新バージョンではありませんが、それが ObjectBuilder 例外の原因であるかどうかを知りたいです。私たちが話している間、私はこの古いコードを最新バージョンに置き換えるための更新に取り組んでいます。これは最新の実装です。残念ながら、変更された理由に関する情報は見つかりません。バグのためかもしれませんし、パフォーマンスのためかもしれません...

private bool InnerMemberRequiresProcessing(IReflectionMemberInfo<TMemberInfo> member)
{
  bool requires;

  if (!_memberRequiresProcessingCache.TryGetValue(member.MemberInfo, out requires))
  {
    lock (_writeLockerMrp)
    {
      if (!_memberRequiresProcessingCache.TryGetValue(member.MemberInfo, out requires))
      {
        Dictionary<TMemberInfo, bool> tempMemberRequiresProcessingCache =
          new Dictionary<TMemberInfo, bool>(_memberRequiresProcessingCache);
        requires = MemberRequiresProcessing(member);
        tempMemberRequiresProcessingCache.Add(member.MemberInfo, requires);
        _memberRequiresProcessingCache = tempMemberRequiresProcessingCache;
      }
    }
  }
  return requires;
}
4

1 に答える 1

1
  1. あなたが言及したシングルトンアプローチで発生する可能性があるように、非常に多数のクラス/メンバーを実行する場合、ハッシュコードの使用は問題に見えます。
  2. 二重ロックは、古いものではまったく奇妙でした (すべての場合で、セクション全体に入るスレッドは 1 つだけです)。最初のロックは確実にパフォーマンスを低下させることに注意してください。代わりに、読み取り中にリストを変更しないようにコピーを作成することに注意してください。
于 2013-06-29T00:35:25.083 に答える