62969


c#で最初にDictionaryに要素を追加し、その後複数のスレッドから読み込む処理があります。  
Dictionaryの初期化処理はasp.netのInitPageで行います。

この場合、読み込み処理でマルチスレッドのため、問題になることはありますでしょうか？


CC BY-SA 4.0
2020-02-11T23:02:34.267
62968
2020-02-12T06:23:09.610
9228
question
c#
Dictionaryは読み込みに対してはスレッドセーフでしょうか？


`System.Collections.Generic.Dictionary<TKey, TValue>` は  
\- 複数スレッドで読み込みのみが行われる場合は安全  
\- 読み込みと書き込みが同時の時は安全でない  
と記載がありますね  
<https://docs.microsoft.com/ja-
jp/dotnet/api/system.collections.generic.dictionary-2?view=netframework-4.8>

`System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>`
はスレッドセーフであるとのこと  
<https://docs.microsoft.com/ja-
jp/dotnet/api/system.collections.concurrent.concurrentdictionary-2?view=netframework-4.8>

毎回同期をとっていると遅いので、途中での更新が無いなら前者のほうが速そう。あるいは `ImmutableDictionary` にする手もありそう。


CC BY-SA 4.0
2020-02-11T23:37:24.740
62969
2020-02-11T23:37:24.740
8589
62968
answer


> c#で最初にDictionaryに要素を追加し、その後複数のスレッドから読み込む処理があります。  
>  Dictionaryの初期化処理はasp.netのInitPageで行います。

`InitPage`が何者かよくわかりませんが、[Page Life Cycle In
ASP.NET](https://www.c-sharpcorner.com/UploadFile/8911c4/page-life-cycle-with-
examples-in-Asp-Net/)などを参考にオブジェクトのライフサイクルを把握しておくことをお勧めします。  
[`Init`イベント](https://docs.microsoft.com/ja-
jp/dotnet/api/system.web.ui.control.init?view=netframework-4.8)等で初期化されているものと推測しますが、このイベントはページが読み込まれた際だけでなく、ボタンクリックなど全てのイベント発生時にも実行されています。「複数のスレッドから読み込む」とされていますが、オブジェクト生成とオブジェクト参照が正しく把握されていないような気がします。


CC BY-SA 4.0
2020-02-12T06:23:09.610
62990
2020-02-12T06:23:09.610
4236
62968
answer