問題タブ [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.

0 投票する
2 に答える
912 参照

c# - マルチスレッド BlockingCollection 同じ値

同じ BlockingCollection にアクセスする C# アプリケーションで 2 つのスレッドを使用しています。これは正常に動作しますが、2 つのスレッドが同じ値を取得するように、最初の値を 2 回取得したいと考えています *.

数秒後、両方のスレッドの currentIndex をポーリングし、すべての値 < インデックスを削除します。たとえば、スレッドの currentIndex の最小値が 5 の場合、アプリケーションはキュー内のインデックス 0 ~ 5 のアイテムを削除します。別の解決策は、すべてのスレッドが値を処理した場合に、キュー内の値を削除することです。

どうすればこれを達成できますか? 別のタイプのバッファが必要だと思います..?

前もって感謝します!

* .Take() がスレッド 1 によって呼び出された場合、アイテムはコレクションから削除され、スレッド 2 は同じアイテムを再び取得できなくなります。


アップデート:

データをバッファに保存したいので、たとえばスレッド1がデータをHDDに保存し、スレッド2が(同じ)データを分析します(並行)。

0 投票する
1 に答える
434 参照

c# - BlockingCollection にアイテムを追加する

もともと私は BlockingCollection を持っていました

それにアイテムを追加しました。

ここで、各 ChannelResource に対応する文字列があることがわかったので、この文字列を含む ChannelResource オブジェクトを BlockingCollection に追加します。

どのように?オブジェクト ChannelResource と文字列をマージして、匿名型を形成しますか?

編集:

つまり、BlockingCollection を次のように再定義する必要があります。

と T が含まれてChannelResourceおり、string一緒に?

0 投票する
1 に答える
367 参照

.net - ConcurrentStack に基づく BlockingCollection で TryPeek を実行する方法

私はにBlockingCollection基づいていConcurrentStackます:

Dim stackBase As New ConcurrentStack(Of MyObject) Dim myStack = New BlockingCollection(Of MyObject)(stackBase)

私のプロデューサーの 1 つで、新しいアイテムを追加する前に、ブロッキング コレクションのトップ アイテムをチェックしたいと考えています。その間、商品が消費者によって削除される可能性があることを理解しています。この場合、特定のオブジェクトを埋めないようにしているだけなので、それは問題ではありません。

は完全ConcurrentStackに機能しますが、オブジェクトTryPeekにアクセスできません。stackBase

何か案は?

0 投票する
0 に答える
600 参照

c# - 競合状態や例外なしでBlockingCollectionのAddingCompletedを検出する方法は?

私は、BlockingCollection{T}1 つのスレッドだけで満たされ、1 つのスレッドだけで消費される を使用しています。アイテムの生産と消費は正常に機能します。問題は、この操作の最後にあります。タスクは (予想どおり) でブロックされGetConsumingEnumerableます。CompleteAddingタスクを呼び出した後、 を破棄しBlockingCollection、例外なく終了します。ここまでは順調ですね。

これで、にアイテムを追加するスレッドができましたBlockingCollection。このスレッドは、テストしIsAddingCompletedてからアイテムを追加する必要があります。IsAddingCompletedしかし、項目の要求と追加の間には競合状態があります。- メソッドがありTryAddますが、追加が既に完了している場合は例外も発生します。

追加のロックなしで完了した項目または追加のテストを追加するにはどうすればよいですか? なぜTryAdd例外をスローするのですか? false追加が完了していれば返却OKです。

非常に単純化されたコードは次のようになります。

はい、項目を追加する機会がほとんどなく、foreach ループが通知しないため、このコードが意味をなさないことはわかっています。消費するタスクは私の問題には関係ありません。

問題はConsumeItem-method に示されています。+の周りConsumeItemに追加のロック (セマフォ) を追加することはできますが、このパフォーマンスへの影響を回避しようとします。CompleteAddingDispose

例外なくアイテムを追加するにはどうすればよいですか? アイテムの紛失は、追加が完了していれば問題ありません。

0 投票する
2 に答える
525 参照

c# - 匿名タスクからの例外を処理するにはどうすればよいですか?

サーバーからデータをチャンクでプルし、処理のために返すメソッドがあります。いくつかの測定を行ったところ、バックグラウンドでチャンクをダウンロードし、BlockingCollection<T>. これにより、クライアントとサーバーは互いに待機するのではなく、同時に動作できます。

呼び出し元 (C++/CLI ライブラリ) は、例外が発生したことを認識して、必要に応じて再試行または救済できるようにする必要があります。戻り値の型を最小限に変更しながら、呼び出し元に例外を伝達する最良の方法は何ですか?

0 投票する
1 に答える
1367 参照

c# - BlockingCollection を使用した Consumer/Producer が遅く見える

以下の「プロデューサー」を介して外部ソケット接続からデータを取得しています。

データを に配置しBlockingCollection、それをコンシューマーが読み取ります。コンシューマーが一定期間内にデータを受信しない場合、ProcessDataOnGridデータが到着するたびに、または少なくとも x ミリ秒後に my が何かを実行するように、いずれにせよ発火します。

問題は、これが推奨されるアプローチであると私が読んだことBlockingCollectionですが、非常に遅いようです。

外部データを取得してから を呼び出すまでの平均時間は 150 ミリ秒ProcessDataOnGridです。私はこれを間違って使用していますか、それとも一定期間だけデータを待つより良い方法はありますか?

プロデューサー:

消費者:

0 投票する
1 に答える
1188 参照

c# - BlockingCollection.TryTake(object,TimeSpan) は新しいデータですぐに返すべきですか?

ブロッキング コレクションのパフォーマンスが遅く見える理由を確認しようとしています。私のコードの簡単なバージョンは、以下の質問に示されています。

ここでの私の質問は、 BlockingCollection.TryTake(object,TimeSpan) が新しいデータにすぐに戻るかどうかです?

私のテストでは、データがすぐには返されないようです。それはおそらく望ましい動作のように思えますか、それとも間違って使用していますか?

コードの前の質問の詳細:

BlockingCollection を使用した Consumer/Producer が遅く見える