2017-02-02 12 views
7

私はいつもこれらのどれを選ぶべきか混乱しています。私はそれを見るように私はListDictionaryを使用し、私はKeyValueとして2つのデータ型をしたい場合ので、私は簡単にそのkeyで値を見つけることができますが、私はConcurrentDictionaryまたはDictionaryを使用する必要がある場合、私はいつも混乱していますか?いつConcurrentDictionaryとDictionaryを使うべきですか?

これまで多くの研究をしていない私には、私は試しましたが、実際にはGoogleで何も得ていないようですDictionaryConcurrentDictionaryしかし、それぞれ個別に何かがあります。

私はこれまでに友人に尋ねましたが、「あなたの辞書をコードで多く使うとConcurrentDictionaryを使用してください」と言っていましたが、もっと詳しく説明することに嫌う人はいませんでした。誰でもこれを拡大できますか?

+0

これらのオブジェクトのそれぞれについて個別に情報を調べた後、それぞれを使用する必要があるときの質問には、どのように答えられませんでしたか? 'Dictionary'を使うべきときと' ConcurrentDictionary'を使うべきときを知っているなら、あなたはすでにその情報を見つけたと言えば、あなたはいつ他のものを使うべきかを知っています。 – Servy

+0

名前の種類はそれを自己説明します。辞書に同時にアクセスする必要があるときは、 'ConcurrentDictionary'を使います。 –

+0

複数のスレッドから辞書にアクセスする場合は、ConcurrentDictionaryを使用します。これがSystem.Collections.Concurrentのネームスペース全体の内容です – Jonesopolis

答えて

15

「辞書をコードでたくさん使用する場合はConcurrentDictionaryを使用する」はあいまいなアドバイスです。私は混乱のためにあなたを責めません。

ConcurrentDictionaryは、複数のスレッド(または非同期タスク)から辞書を更新する環境で使用するためのプライマリです。あなたはConcurrentDictionary上のメソッドを見れば、あなたはTryAddTryGetValueTryUpdateのようないくつかの興味深い方法を発見します)

を、そして、あなたはそれが単一のスレッドからだ場合は、好きなだけコードから標準Dictionaryを使用することができますTryRemove

たとえば、通常のDictionaryクラスを使用する場合に表示される典型的なパターンを考えてみましょう。

// There are better ways to do this... but we need an example ;) 
if (!dictionary.ContainsKey(id)) 
    dictionary.Add(id, value); 

これは、キーが含まれており、別のスレッドAddを呼び出すと、同じidAddを呼び出すことができるかどうかのチェックの間という点で問題があります。このスレッドがAddを呼び出すと、例外がスローされます。方法TryAddはそれを処理し、追加したかどうか(またはそのキーがすでに辞書に入っているかどうか)を示すtrue/falseを返します。

マルチスレッドのコードセクションで作業しているのでなければ、おそらく標準のDictionaryクラスを使用できます。言い換えれば、理論的には、辞書への同時アクセスを防ぐためのロックを持つことができます。その質問はすでに"Dictionary locking vs. ConcurrentDictionary"に記載されています。

+1

答えをありがとう、それは多くの助けになりました。単一のスレッドから来てもそのような悪いことがあってもどこでもConcurrentDictionaryを使用しますか? – Ashkru

+1

スレッドを作成する前に書き込みを行う場合は、非並行形式を使用できますか(1つのマルチスレッド、読み取りのみ)?私はこれがより高速であると想像して、それがどのように壊れるかを見ることができません。 –

+0

おそらく 'ConcurrentDictionary'の使用には問題はありませんが、辞書がどのように使用されているかによって、ボトルネックになる可能性があると思っています。ソースを比較して何が起きているのかを確認するには、[ConcurrentDictionary.TryAddInternal()](https://referencesource.microsoft.com/#mscorlib/system/Collections/Concurrent/ConcurrentDictionary.cs)のソースをチェックし、 bc495056297a0851)と[Dictionary.Insert()](https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,fd1acf96113fbda9)を参照してください。 –

0

ConcurrentDictionaryは、複数のスレッド(つまりマルチスレッド)で辞書にアクセスする必要がある場合に便利です。 Vanilla Dictionaryオブジェクトにはこの機能がないため、シングルスレッドの方法でのみ使用する必要があります。

+0

ConcurrentDictionaryをどこでも使っていますが、単一のスレッドから来てもそのような悪いことはありますか? – Ashkru

+0

いいえ、後でプログラムをマルチスレッドする予定がない場合は、コードを読んでいる誰かを混乱させるでしょう。また、アクセス権を複数のスレッドで管理する必要があるため、同時データ構造にいくつかのオーバーヘッドが発生することが予想されます。 – Woody1193

+0

いいえ、悪いことのように進んでください。私が尋ねる理由は、現在、メインスレッド以外のスレッドからアクセスされていないためですが、将来はそれが可能であるためです。マルチスレッドを実装することを決定した場合、Concurrentを使用してすべての方法を処理したり、コードを変更したりする価値はありますか? – Ashkru

0

CocurrentDictionaryDictionary以上に使用する最大の理由は、スレッドセーフです。アプリケーションで同じ辞書を同時に使用する複数のスレッドが同時に取得される場合は、スレッドセーフである必要があります。CocurrentDictionaryこれは、スレッドが辞書に書き込みを行っているときや構築しているときに特に当てはまります。

関連する問題