2012-01-05 10 views
5

申し訳ありませんが、私は奇妙な小さな問題に直面しており、率直に言って私はアイデアがありません。私はこれをそこに投げ捨てて、私が間違っていたものがないか、またはConcurrentDictionaryが正しく動作していないかどうかを確認します。ここでは、コードです:ConcurrentDictionary - 辞書やコードが壊れていますか?

(キャッシュは、静的ConcurrentDictionaryキーを含むクラスである)

問題は時折tmpを実行するためのTryRemoveラインを引き起こし、nullで、まだ上記return null;ラインがヒットされることはありませんということです。そのreturn nullnullを辞書に入れて実行する唯一のものなので、どうすればtmpnullになりますか?

Cacheクラス(SetNamesは、このコードでは使用されません)を含む

:あなたが戻ってcontext.GetKeys(key)から設定された単一の項目以外のものを取得する場合

public class Cache 
{ 
    public static ConcurrentDictionary<Type, Info> Keys = new ConcurrentDictionary<Type, Info>(); 
    public static ConcurrentDictionary<Type, string> SetNames = new ConcurrentDictionary<Type, string>(); 
} 
+0

多分、既に辞書に「ヌル」値がありますか? –

+0

このコードを実行しているスレッドの数はいくつですか?スレッドセーフではないようです。 – oleksii

+0

@IlyaKogan - いいえ、ディクショナリは起動時に空であり、 'if(tmp == null)'内のブレークポイントがヒットした場合でも、nullを含むことはありません。 –

答えて

0

私はこの前にこれを閉じておくべきでしたが、私はそれを完全に忘れました。この例はTryRemoveのためスレッドセーフではありませんが、デバッグの目的でのみ追加されています。私はそれを書き直すことによって問題を回避することになったので、おそらく何らかのコードが古くなっているというコメントの一部は正しいでしょう。しかし、コードはもはや確認のために存在しません。

私はこのエラーをユーザーエラーにまでぶち壊しています(もちろん私自身です)。みんなありがとう!

3

tmpはnullにすることができます。その場合はkeys.Count() != 1となり、指定されたキーについてはCache.Keysにヌルアイテムが挿入されます(GetOrAddから返され、tmpに割り当てられます)。

EDIT:別の可能性を考えました。キーはどんなデータ型ですか?カスタムクラスですか?それはそうであるように見えます。もしそうなら、EqualsGetHashcodeを正しく実装しましたか?

+0

しかし、OPは 'return null'行は決して実行されないと述べています。正しい場合は、あなたのシナリオが決して起こらないことを意味します。 – phoog

+0

@phoogは正しいです - 私はまた、 'context.GetKeys(key)'と同様に入力パラメータを二重チェックしました。このケースではこのデータは発生しません。私はそれが将来起こることを期待していますが、それは問題ではありません。 –

+0

OPは間違っています:-)辞書には、指定されたキーのヌルが含まれているか、ヌル行が返されます。さて、変数名から、** Keys **メンバーのGetOrAddへの呼び出しについて疑念を抱いていますが、それは別の話です。 –

関連する問題