0

そのため、WeakReferences を使用したコードがあります。私は一般的な.IsAlive競合状態を知っているので、それを使用しませんでした。私は基本的に次のようなものを持っています:

WeakReference lastString=new WeakReference(null);
public override string ToString()
{
  if(lastString!=null)
  {
    var s=lastString.Target as string; //error here
    if(s!=null)
    {
      return s;
    }
  }
  var str=base.ToString();
  lastString=new WeakReference(str);
  return str;
}

どういうわけか、マークされた行で null 参照例外が発生しています。デバッグすることで、null チェックでラップされ、lastString が実際には null に設定されていないにもかかわらず、lastString が実際に null であることを確認できます。

これは複雑なフローでのみ発生するため、ガベージ コレクションがターゲットだけでなく実際の WeakReference オブジェクトを何らかの形で取得していると思われます。

これがどのように起こっているのか、そして最善の行動方針は何かについて、誰かが私に教えてもらえますか?

編集:この原因をまったく特定できません。エラーコードをtry-catchでラップすることになりました。今のところ修正してください。しかし、私はこれの根本的な原因に非常に興味があります。これを単純なテスト ケースで再現しようと試みてきましたが、非常に難しいことが証明されています。また、これは単体テスト ランナーで実行している場合にのみ発生するようです。コードを最小限に抑えると、TestDriven と Gallio を使用して実行するとクラッシュし続けますが、コンソール アプリケーションに配置すると失敗しません。

4

1 に答える 1

1

これは、目に見えるロジックのバグを見つけるのが非常に困難でした。

問題のある if ステートメントは、実際には次のようなものでした。

if(lastString!=null && limiter==null || limiter=lastLimiter)

これを実際にグループ化すると、次のようになります。

if((lastString!=null && limiter==null) || limiter=lastLimiter)

そして、マーフィーの法則が何らかの形で、この 1 つの無関係なテスト ケースで指示するように、この 1 つのテスト ケース以外のどこにも使用されていないメソッドによって null に設定されましたlastLimiterlastString

そうです、CLR のバグではなく、私自身のロジックのバグで、見つけるのが非常に困難でした。

于 2013-07-03T14:26:46.113 に答える