問題タブ [concurrentdictionary]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#を使用した1つのConcurrentDictionaryの配列への値の入力と取得
これまで、私は単純な配列を使用して必要な情報を入力および取得していました。
最初の例は次のとおりです。
そして2番目の例:
しかし、現在、各配列に識別番号を割り当てようとしているので、1つのConcurrentDictionaryで複数の異なる配列を識別できます。
辞書の配列から情報を入力および取得するにはどうすればよいですか?
ほら、2つの識別子と2つの辞書があります。
私はこのようなものを想像していました:
PS:上記のコードは機能しません(自作であるため)。では、ConcurrentDictionaryのstring[]とstring[] []にIDで情報を入力する正しい方法は何ですか?(そしてそれを取り出すために)
c# - `ConcurrentDictionary.GetOrAdd`に値を追加しないように指示するにはどうすればよいですか?
値のキャッシュに使用する場合がいくつかありConcurrentDictionary<TKey, TValue>
ますが、多くの場合、を使用して値をキャッシュに追加するかどうかを決定するために、値の検証を実行する必要がありますConcurrentDictionary<TKey, TValue>.GetOrAdd(TKey, Func<TKey, TValue>)
。
通常、次の線に沿って:
今日私がこれを処理する方法は、正常に機能しているように見える例外をスローすることですが、よりクリーンなアプローチ(おそらく、設定できるフラグまたは戻り値を設定できる特定の値)を使用してGetOrAdd
、ラムダ(実際には本格的な方法に置き換えることができますが)。
他のLINQのようなメソッドでの私の経験に基づくと、返すnull
と、そのようにチェックされずに値が追加されることになります(そして、ILを読み取るとGetOrAdd
、同じ問題が発生するように見えます)。動作します。
例外を使用して追加をキャンセルすることを回避できる方法はありGetOrAdd
ますか?
c# - C#コンカレントディクショナリがリストを保存しないページ読み込み間の値
私がこれに困惑してからしばらく経ちました。クレイジーなことは、コードの他の領域でこれを数回行ったので、ほぼ完全なコピーアンドペーストですが、このコードが正しく機能していないことを除いてです。だから私はどういうわけか非常に明白な何かを逃しています。
上記のクラスは、次のようにApplication_Start()global.asax.csでインスタンス化されます。
そのため、ページの読み込みの合間に、UpdateRoomOnlineTraderListが呼び出されたときに、辞書がリストに追加した値を保持していません。ステップスルーすると、リストが表示されます。次にページをロードすると、ページはなくなり、100%ですが、この値を辞書から削除することは他にありません。
辞書がページの読み込み間で値を保持しないのはどうしてですか?キーは保持されますが、値は消えます。私は困惑しています。
dapper - dapper.net、ConcurrentDictionary をフラッシュする方法は?
私はダッパーを初めて使用し、新しいプロジェクトで使用する予定です。それを読んだ後、私が抱えているかもしれない唯一の問題は ConcurrentDictionary のようです。
Dapper は、実行するすべてのクエリに関する情報をキャッシュします。これにより、オブジェクトをすばやく具体化し、パラメーターをすばやく処理できます。現在の実装では、この情報を ConcurrentDictionary オブジェクトにキャッシュします。格納されているオブジェクトがフラッシュされることはありません。パラメータを使用せずにオンザフライで SQL 文字列を生成している場合、メモリの問題が発生する可能性があります。辞書を LRU キャッシュに変換する場合があります。
この問題を回避するにはどうすればよいですか? 誰かがそれをフラッシュする方法とタイミングを教えてくれるコードを見せてもらえますか?
c# - ConcurrentDictionary の使用に関するいくつかの質問
現在、C# アプリケーションを作成しています。私は ConcurrentDictionary を使用するのが初めてなので、スレッドの安全性についていくつか質問があります。まず、これは私の辞書です:
これをクラスでインスタンス化し、ITask を実装するすべてのオブジェクトを追跡するために使用します。マルチスレッド環境でセットアップが正しく機能することを確認したい。
複数のスレッドが ConcurrentDictionary 内の項目数を取得したい場合、ロックする必要がありますか?
ディクショナリから特定のキーを取得し、そのキーのオブジェクトを取得してメソッドを呼び出したい場合、ロックする必要がありますか? 例えば:
ITask の Execute メソッドを呼び出すために、複数のスレッドが Run メソッドを呼び出す可能性があることに注意してください。私の目標は、すべてをスレッド セーフにし、可能な限りパフォーマンスを高めることです。
.net - System.Collections.Concurrentコレクションの拡張メソッドはスレッドセーフですか?
たとえば、ConcurrentDictionaryクラスには、IEnumerableインターフェイスを実装しているため、いくつかの拡張メソッドがあります。これらのメソッド(たとえば、First、Sum、Takeなど)は本質的にスレッドセーフですか?
c# - 毎秒 4k から 7k のルックアップまたは書き込みを処理できる効率的なメモリ内キャッシュが必要
マルチスレッド CPU で 80 バイトのデータを毎秒 5k から 10k レコードのレートで受信する効率的な C# アプリケーションがあります。
次に、重複レコードを検出してフィルター処理するためにメモリ内キャッシュを設定する必要があります。これにより、重複レコードがパイプラインをさらに進むのを抑制することができます。
キャッシュの仕様 (最大しきい値)
- 80バイトのデータ
- 10,000 レコード/秒
- 60 秒のキャッシュ = キー数 = 60,000
- (小計 48000000 バイト = 48Mb )
- 理想的なキャッシュ サイズ = 5 分 (または 240Mb)
- 許容可能なランタイム キャッシュ サイズの膨張 = 1 GB
質問
最も効率的なルックアップ、古いキャッシュ データのパージ、およびヒットしたデータの有効期限切れを防止できるメモリ内キャッシュ、ディクショナリ、ハッシュ テーブル、配列などを設定する最善の方法は何ですか。
ASP.Net Cache、System.Runtime.MemoryCacheを見ましたが、正しいスループットを達成するには、より軽量でカスタマイズされたものが必要だと思います。また、代わりにSystem.Collections.Concurrentと、これに関連するホワイトペーパーも検討しています。
最善のアプローチが何であるかについて誰か提案がありますか?
c# - System.Collections.Concurrent.ConcurrentDictionary での競合状態に対する防御
.NET ConcurrentDictionary は競合状態の影響を受けやすく、この MSDN 記事の下部で説明されているように、予期しないデータが発生する可能性があります。 考慮すべきいくつかの要因があると思います。
Q:データの損失を引き起こす可能性のある競合状態に対して脆弱でないコードをどのように記述すればよいですか?
私のシナリオでは、常に増加するインデックス (n++) を持つ入力ストリームがあります。私の考えでは、競合状態が発生した場合に欠落データを検出して再送信できると考えています。一方で、私が気付いていない、これを行うためのより良い方法があるかもしれません。
c# - How should I keep 2 ConcurrentDictionaries in sync?
I like the lock-free operation of the ConcurrentDictionary and use it in two objects:
These two objects need to stay in Sync. Is the only way to do this is to use a Lock, thus avoiding all benefits of the Concurrent dictionary?
c# - BlockingCollection で ConcurrentDictionary をラップする方法は?
BlockingCollection でラップして ConcurrentDictionary を実装しようとしましたが、成功していないようです。
ConcurrentBag<T>
、ConcurrentQueue<T>
などの BlockingCollection で 1 つの変数宣言が機能することを理解しています。
したがって、BlockingCollection にラップされた ConcurrentBag を作成するには、次のように宣言してインスタンス化します。
しかし、ConcurrentDictionary に対してそれを行う方法は? プロデューサ側とコンシューマ側の両方で BlockingCollection のブロッキング機能が必要です。