0

保護されたメソッドを持つ抽象クラスがあります。このメソッド内で辞書を使用しています。このクラスには 2 つの実装があります。どちらのクラスも、一部の操作でこの保護されたメソッドを呼び出します。両方の実装が異なるスレッドで実行されている場合、保護されたメソッド内の辞書はスレッドセーフですか?

保護されたメソッドは次のとおりです

protected Dictionary<string, string> GenerateParameterFromQueue()
    {
        Dictionary<string, string> parameters;
        string queueInput = this._Queue.QueueInput;
        string[] inputArray = Regex.Split(queueInput,Constants.KEY_DELIMITER); 

        parameters = inputArray.ToDictionary(s => s.Split(Convert.ToChar(Constants.KEY_EQUALITY))[0], s => s.Split(Convert.ToChar(Constants.KEY_EQUALITY))[1]);

        return parameters;
    }
4

3 に答える 3

2

はい、メソッド内の辞書はメソッド自体のスレッドごとに作成されるため、 の使用Dictionaryはスレッドセーフです。もちろん、これは、メソッドが返された後にメソッド外でそれを使用すると、自動的にスレッド セーフになるという意味ではありません。

問題が発生するのは、2 つのスレッドが 1 つのスレッドにアクセス/変更した場合のみですDictionary。保護されているメソッドとは関係ありません。

メソッドで心配するのは this._Queue 変数ですが、これは複数のスレッド間で共有されており、ロックしていないため、それ自体がスレッドセーフであることを確認する必要があります。

于 2012-09-25T11:31:41.923 に答える
0

ディクショナリは「スレッドセーフ」ですが、保護されたメソッドであるためではありません。ディクショナリをゼロから生成しているため、スレッドセーフです。

于 2012-09-25T11:29:22.520 に答える
0

キーワードのみは、そのprotectedメソッドが含まれている型またはサブクラス内でのみ表示されることを意味します。スレッドセーフにはなりません。メソッドへのDictionaryスレッド呼び出しごとに が作成されています。これにより、Dictionaryこの例ではスレッドが安全になります...

スレッド セーフなコレクションについては、ConcurrentCollectionクラスを参照してください。

これが役立つことを願っています。

于 2012-09-25T11:29:26.053 に答える