問題タブ [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の代わりにメッセージループでRxを使用する
「クライアント」の複数のインスタンスに接続された「ホスト」の単一のインスタンスを中心に構築された単純なメッセージングフレームワークがあります。各インスタンスは、メッセージをプッシュすることで他のインスタンスと通信します。次に、インスタンスは、別のタスクを使用して受信した順序で独自のメッセージを処理します。
コードの簡略化されたバージョンは次のとおりです。
私の要件は、メッセージを処理する各インスタンスが(可能であれば)並列実行を利用し、各メッセージがクラスごとに一度に1つずつ受信された順序で処理されることです。
GetConsumingEnumerable()からプルするだけの新しいタスクを生成するのは悪い考えですか?
リアクティブ拡張機能とIObserveableを使用してこれを単純化できるように感じますが、Rxの使用にはまだかなり慣れておらず、並列実行のニーズを満たすためにRxをどのように構成するかがわかりません。
どんなガイダンスでも大歓迎です!
c# - BlockingCollectionが期待どおりに実行されない
Func
と呼ばれるバックグラウンドスレッドで渡されたスレッドを呼び出すメソッドがありますTaskSpin
。DataGridView
これは、 (DGV)でクリックされたサイトに基づいて、一度に1つの方法を実行し、一度に1つだけ実行できる必要があります。そこで、サイト(DGVのボタンセル)をクリックすると、そのサイトでメソッドが実行されます。今はたくさんのサイトがあり、何百回もクリックして待つのではなく、DGVに含まれるすべてのサイトをバッチ処理したいと思っています。これらを実行するためにストレートループを使用することはできません。
これはほとんどすぐに呼び出し元に戻り、共有ファイルを使用するため、次のサイトの実行を開始します。したがって、サイトを1つずつ実行するためにキューに入れる方法が必要です。を使用することにしましたConncurrentCollection - BlockingCollection
が、行き詰まりました。いくつかのボタンクリックイベントで私は持っています
ここでAsyncMethod
、TPLを使用してバックグラウンドスレッドでsetメソッドを起動しました。
私の期待は、これがAction<object[]>
次々に実行されることです。しかし、これは私のアプリケーションをフリーズさせているだけです。私はここで何が間違っているのですか?
御時間ありがとうございます。
*編集。TaskSpin *
c# - BlockingCollection 配列を作成できません
次のコードがあります。
一番下の行に次のエラーが表示されます。
タイプ 'System.Collection.Concurrent.BlockingCollection' の式に [] を使用したインデックス作成を適用することはできません
私がしても:
最後の角括弧でエラーが発生します。
構文エラー; 期待値
BlockingCollection
私ができるように、のコレクションでの配列を作成しようとしてConcurrentQueue
います:
私は何を間違っていますか?それを修正するにはどうすればよいですか? の配列を作成できないBlockingCollection
ので、リストを作成する必要がありますか?
c# - BlockingCollectionにコレクションを追加します
BlockingCollectionには、個々のアイテムを追加するためのメソッドのみが含まれています。コレクションを追加したい場合はどうすればよいですか?「foreach」ループを使用する必要がありますか?
BlockingCollectionにコレクションを追加するメソッドが含まれていないのはなぜですか?そのような方法はかなり便利だと思います。
.net-4.0 - BlockingCollectionを消費する唯一の方法はforeachですC#で?
私は今TPLで働き始めています。このビデオでは、TPLを利用した生産者/消費者モデルの簡単なバージョンを見てきました。
ここに問題があります:
次のコード:
IEnumerable<Double>
foreachを使用して反復(および自動的に消費)できるanを返します。
私の質問は次のとおりです。
IEnumerator<Double> dEnum = d.GetEnumerator()
fromを取得した場合(たとえば、ループでd
反復処理するため) 、リストも消費されますか?(私の答え:私が何を意味するかを知っているなら、はとリンクされていないので、私はそうは思いません。したがって、それは消費しますが、消費しませんし、さらには)d
while
d.MoveNext()
dEnum
d
dEnum
d
bc
- ループ以外の方法でループ
bc
(または)して、アイテムを消費してもよいですか?(サイクルはループよりもはるかに速く、科学計算の問題のパフォーマンスの問題が心配です)d
foreach
while
foreach
- タイプで正確に消費するとはどういう意味
BlockingCollection<T>
ですか?
例:コード:
よろしくお願いします!
.net - .Net Concurrent BlockingCollection にメモリ リークがありますか?
> を含むプロデューサー/コンシューマー パターンを使用System.Collection.Concurrent.BlockingCollection<DataTable
して、データベース (プロデューサー) からデータを取得し、データ (コンシューマー) に Lucene インデックスを作成します。
Producer は一度に 10000 レコードを取得し、セットを に追加しBlockingCollection<DataTable>
ます。コンシューマー (少し遅い) は、それらの 10000 を取得してインデックスを作成します。
ブロッキング コレクションは、<DataTable>
それぞれ 10000 行中 5 行に制限されています。
最初はプログラムはうまく動作しますが、約 150000 行を取得した後、コンピューターのメモリが使い果たされ、速度が遅くなることに気付きました。
null
アイテムが取得された後、BlockingCollection が基になる配列スロットを設定できないようです。
コード:
この一時停止を拒否したことを確認できる人はいますか? 回避策はありますか?
c# - BlockingCollectionの配列を消費する方法、C#では一度に1つの要素?
BlockingCollection<T>
生産者/消費者シナリオでを消費する方法の例をたくさん見てきましたが、ここでは一度に1つの要素を消費する方法もあります。しかし、私は並列プログラミングにまったく慣れていないので、次の問題に直面しています。
実際、問題は、配列内のすべての要素に対して最初の2つを消費し、次に配列内のすべての要素に対して次の2つを消費するように、以下の例のメソッドをどのように記述するかConsumerProducerExample.ConsumerMethod
です。double
BlockingCollection<Double>
double
以下の例でメソッドを記述しましたが、それは私が望む方法ではありません。それは私が上でリンクした例に基づいて行う方法を私が知っていることです。これは正反対の方法です。ここにあるように、配列double
の次の配列にジャンプする前にすべてを消費しBlockingCollection<Double>
ます。そして、繰り返しますが、2つだけを消費しdouble
、次にジャンプして2つをBlockingCollection<Double>
消費するdouble
などです。配列ループが完了した後、要素double
ごとに次の2つをBlockingCollection<Double>
再び消費します。
これらは次のように使用する必要があります。
助言がありますか?
要するに、これはnEl
微分方程式の解のピークを同時に数える試みです(解はこの例ではで表されsin(x)
ます)。
c# - 制限されたBlockingCollectionsは追加中にデータを失う可能性があります
BlockingCollection(ConcurrentBag、50000)があり、コンシューマースレッドのConcurrentDictionaryで処理できるレコード数を最大化するために、プロデューサースレッドに50,000という非常に小さな境界容量を使用しようとしています。プロデューサーはコンシューマーよりもはるかに高速で、それ以外の場合はほとんどのメモリを消費します。
残念ながら、ConcurrentDictionaryのレコードの総数が、テストデータの実行時に50,000の制限付き容量を追加した後、必要な数よりも大幅に少なくなっていることにすぐに気付きました。BlockingCollectionの.addメソッドは、コレクションにaddを実行するスペースができるまで、無期限にブロックする必要があることを読みました。ただし、これは当てはまらないようです。
質問:
BlockingCollectionの容量が解放される前に呼び出されるaddが多すぎると、BlockingCollectionの.addメソッドは最終的にタイムアウトするか、サイレントに失敗しますか?
#1の答えが「はい」の場合、データを失うことなく境界容量を超えた後、何回追加を試みることができますか?
容量を待機/ブロックしている多くのBlockingCollection.add()メソッドが呼び出され、CompleteAdding()メソッドが呼び出された場合、それらの待機/ブロック追加は待機を続け、最終的に追加しますか、それともサイレントに失敗しますか?
c# - BlockingCollection複数のコンシューマー
1つのプロデューサースレッドと複数のコンシューマースレッドを持つ次のコードがあります。複数のコンシューマーがスレッドセーフかどうか知っていますか。たとえば、スレッド1が消費している可能性がありますが、そのスレッド2は並行して消費し、スレッド1で使用されているアイテムの値を変更しますか?
前もって感謝します
c# - ObservableCollection を BlockingCollection で更新する
新しい要素を受け取ったときに Event を発生させるサービスに登録し、この要素を に追加しBlockingCollection
ます。監視可能なコレクション内の要素を追加/更新するために
ループする 2 番目のスレッドを実行しています。BlockingCollection
問題は、どのように ? を追加するObservableCollection
かです。.add
UI スレッドで実行する必要があるため、このタイプのコレクションでは実行できないことはわかっています。そのため、ディスパッチャーを使用して要素の追加をマーシャリングする別ObservableCollection
のサブクラスを使用しようとしましたが、毎回同じエラーが発生します
「タイプ 'System.StackOverflowException' の未処理の例外が不明なモジュールで発生しました。」
トラブルシューティングのヒントは次のとおりです。
無限ループや無限再帰がないことを確認してください。
BlockingQueue
1 秒あたり 5 から 10 のように、常に新しい要素を受信しているため、実際にはある種の無限ループがあります。ただし、コントロールをにバインドしない場合、または代わりにリストを使用する場合
、例外は発生しません。observablecollection
編集バグを追跡していると、バグは自然に消えました。問題がどこにあるのかを本当に理解するために、物事を単純化しようとしていましたが、それが機能し始めました. 物事を元に戻すと、まだ機能します...しかし、リストビューにスタイルを追加するなどの無関係な理由で、時々戻ってきます。サードパーティの dll に問題があるのではないかと考え始めています。