問題タブ [blockingcollection]
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# - マルチスレッド BlockingCollection 同じ値
同じ BlockingCollection にアクセスする C# アプリケーションで 2 つのスレッドを使用しています。これは正常に動作しますが、2 つのスレッドが同じ値を取得するように、最初の値を 2 回取得したいと考えています *.
数秒後、両方のスレッドの currentIndex をポーリングし、すべての値 < インデックスを削除します。たとえば、スレッドの currentIndex の最小値が 5 の場合、アプリケーションはキュー内のインデックス 0 ~ 5 のアイテムを削除します。別の解決策は、すべてのスレッドが値を処理した場合に、キュー内の値を削除することです。
どうすればこれを達成できますか? 別のタイプのバッファが必要だと思います..?
前もって感謝します!
* .Take() がスレッド 1 によって呼び出された場合、アイテムはコレクションから削除され、スレッド 2 は同じアイテムを再び取得できなくなります。
アップデート:
データをバッファに保存したいので、たとえばスレッド1がデータをHDDに保存し、スレッド2が(同じ)データを分析します(並行)。
c# - BlockingCollection にアイテムを追加する
もともと私は BlockingCollection を持っていました
それにアイテムを追加しました。
ここで、各 ChannelResource に対応する文字列があることがわかったので、この文字列を含む ChannelResource オブジェクトを BlockingCollection に追加します。
どのように?オブジェクト ChannelResource と文字列をマージして、匿名型を形成しますか?
編集:
つまり、BlockingCollection を次のように再定義する必要があります。
と T が含まれてChannelResource
おり、string
一緒に?
.net - ConcurrentStack に基づく BlockingCollection で TryPeek を実行する方法
私はにBlockingCollection
基づいていConcurrentStack
ます:
Dim stackBase As New ConcurrentStack(Of MyObject)
Dim myStack = New BlockingCollection(Of MyObject)(stackBase)
私のプロデューサーの 1 つで、新しいアイテムを追加する前に、ブロッキング コレクションのトップ アイテムをチェックしたいと考えています。その間、商品が消費者によって削除される可能性があることを理解しています。この場合、特定のオブジェクトを埋めないようにしているだけなので、それは問題ではありません。
は完全ConcurrentStack
に機能しますが、オブジェクトTryPeek
にアクセスできません。stackBase
何か案は?
c# - 競合状態や例外なしでBlockingCollectionのAddingCompletedを検出する方法は?
私は、BlockingCollection{T}
1 つのスレッドだけで満たされ、1 つのスレッドだけで消費される を使用しています。アイテムの生産と消費は正常に機能します。問題は、この操作の最後にあります。タスクは (予想どおり) でブロックされGetConsumingEnumerable
ます。CompleteAdding
タスクを呼び出した後、 を破棄しBlockingCollection
、例外なく終了します。ここまでは順調ですね。
これで、にアイテムを追加するスレッドができましたBlockingCollection
。このスレッドは、テストしIsAddingCompleted
てからアイテムを追加する必要があります。IsAddingCompleted
しかし、項目の要求と追加の間には競合状態があります。- メソッドがありTryAdd
ますが、追加が既に完了している場合は例外も発生します。
追加のロックなしで完了した項目または追加のテストを追加するにはどうすればよいですか? なぜTryAdd
例外をスローするのですか? false
追加が完了していれば返却OKです。
非常に単純化されたコードは次のようになります。
はい、項目を追加する機会がほとんどなく、foreach ループが通知しないため、このコードが意味をなさないことはわかっています。消費するタスクは私の問題には関係ありません。
問題はConsumeItem
-method に示されています。+の周りConsumeItem
に追加のロック (セマフォ) を追加することはできますが、このパフォーマンスへの影響を回避しようとします。CompleteAdding
Dispose
例外なくアイテムを追加するにはどうすればよいですか? アイテムの紛失は、追加が完了していれば問題ありません。
c# - 匿名タスクからの例外を処理するにはどうすればよいですか?
サーバーからデータをチャンクでプルし、処理のために返すメソッドがあります。いくつかの測定を行ったところ、バックグラウンドでチャンクをダウンロードし、BlockingCollection<T>
. これにより、クライアントとサーバーは互いに待機するのではなく、同時に動作できます。
呼び出し元 (C++/CLI ライブラリ) は、例外が発生したことを認識して、必要に応じて再試行または救済できるようにする必要があります。戻り値の型を最小限に変更しながら、呼び出し元に例外を伝達する最良の方法は何ですか?
c# - BlockingCollection を使用した Consumer/Producer が遅く見える
以下の「プロデューサー」を介して外部ソケット接続からデータを取得しています。
データを に配置しBlockingCollection
、それをコンシューマーが読み取ります。コンシューマーが一定期間内にデータを受信しない場合、ProcessDataOnGrid
データが到着するたびに、または少なくとも x ミリ秒後に my が何かを実行するように、いずれにせよ発火します。
問題は、これが推奨されるアプローチであると私が読んだことBlockingCollection
ですが、非常に遅いようです。
外部データを取得してから を呼び出すまでの平均時間は 150 ミリ秒ProcessDataOnGrid
です。私はこれを間違って使用していますか、それとも一定期間だけデータを待つより良い方法はありますか?
プロデューサー:
消費者:
c# - BlockingCollection.TryTake(object,TimeSpan) は新しいデータですぐに返すべきですか?
ブロッキング コレクションのパフォーマンスが遅く見える理由を確認しようとしています。私のコードの簡単なバージョンは、以下の質問に示されています。
ここでの私の質問は、 BlockingCollection.TryTake(object,TimeSpan) が新しいデータにすぐに戻るかどうかです?
私のテストでは、データがすぐには返されないようです。それはおそらく望ましい動作のように思えますか、それとも間違って使用していますか?
コードの前の質問の詳細: