問題タブ [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<T> を消費する方法
ただし、(上記のリンクで) GetConsumingEnumerable を使用しないと怪しいようです。
コンシューマー (特異である必要があります) がコレクションを空にしている間、プロデューサーを効果的にブロックする正しい方法は何ですか?
[バッチ処理を行いたいのは、各バッチが Web サービス呼び出しを行うためです。これは、すべてのメッセージ/アイテムが独自の呼び出しを必要とする場合にボトルネックとなります。メッセージ/アイテムのバッチ処理は、このボトルネックの解決策です。]
理想的には:
1) メッセージを受け取る
2) コレクションにプッシュする新しいプロデューサー タスク
3) コレクションが「フル」(任意の制限) の場合、すべてのプロデューサーをブロックし、新しいコンシューマー タスクがコレクションのすべてを消費してから、プロデューサーのブロックを解除します。
言い換えると; (並列プロデューサー) xor (単一の消費者) がいつでもコレクションに作用することを望みます。
これは以前に行われるべきだったようですが、特にこのように動作するコードスニペットが見つからないようです。
助けてくれてありがとう。
c# - ブロッキングコレクションを使用したファイル書き込み
サーバーからデータをリッスンして書き込むtcpリスナーがあります。を使用しBlockingCollection
てデータを保存しました。ここでは、ファイルがいつ終了するかわかりません。したがって、私のファイルストリームは常に開いています。
私のコードの一部は次のとおりです。
問題は、ループ内でファイルストリームを破棄できないことです。そうしないと、各行のファイルストリームを作成する必要があり、ループが終了しない可能性があります。
c# - 10 秒以内に再試行しない BlockingCollection
私は を as として使用してBlockingcollection
いますが、ファイル ロックが発生しやすいFIFO queue
ファイルに対して多くの操作を行っています。キュー内の他のアイテムがたくさんある場合、これは十分な一時停止ですが、空または非常に短い場合は、ファイルがロックされている可能性が高い自体の再発を繰り返してキューを永久にハンマーで打つことを意味します。consumer
FIFO queue
FIFO queue
consumer
すなわち
consumer busy
-> requeue -> consumer busy
-> requeue (無制限)
BlockingCollection
10 秒未満の新しいコンシューマーを実行しないようにする方法はありますか? つまり、潜在的にキュー内のネット 1 を取得して続行し、createdDateTime が null (最初の試行のデフォルト) である場合、または 10 秒を超える場合にのみ、次の消費者を取得しますか?
c# - BlockingCollection の起動に時間がかかりすぎています
BlockingCollection<MyItem>
が通話から復帰するのに時間がかかりすぎるという問題があり.Take()
ます。
シナリオは次のとおりです。データを非常に高速にプッシュするスレッドがありますBlockingCollection
(実際には XUnit でfor
ループを実行しました。呼び出しTask
中に座っ.Take()
てアイテムが追加されるのを待っている 3 があります。出力から、ほぼ 200 個のアイテムが表示されます。 (最大 1 秒以上) 最初のTask
起床前にコレクションに追加され、実際に からデータを収集しますBlockingCollection
。
私は、パイプライン方式で編成された複数の「バッファ」を持っていますBlockingCollection
が、それらはすべて、アクションであまりにも多くの時間をかけて起きていることに苦しんでいます.Take()
。
私は試し.TryTake()
てみ.GetConsumingEnumerable()
ましたが、同じ結果でした。
このパイプラインの最後に、アイテムを 1 つずつ処理する 1 つのスレッドの遅い関数があり、1 つのアイテムを処理するのに不明な時間がかかる可能性があるという考え。「アイテム」が「バッファ」から「バッファ」に非常に速く渡されることを確認する必要があるだけです(最初の「バッファ」に挿入されるとすぐに)
アイテムがコレクションに追加された時間の近くで起動時間が発生することを確認する必要があり.Take()
ます。.TryTake()
c# - ブロッキング コレクションを使用したファイル ピックアップ プロセスの作成
私が現時点で持っているのは、5000ミリ秒ごとに起動するタイマーです:
起動すると、ファイルを処理するためのキューが設定されます。
ブロッキング キュー自体:
私が持っているものは、タイマーを開始する->タイマーを停止する->フォルダー内のすべてのファイルを収集するプロセスをトリガーする->すべてのファイルを処理する->タイマーを再起動するという方法です。
特にアカウント用に作成されるキューの数が 200 ~ 400 の場合に、私が行っていることを行うためのより良い方法があると思わずにはいられません。
ありがとう
c# - C# のブロッキング コレクションに相当する変数
これには明らかな答えがあるかもしれませんが、とにかく尋ねます。
C# のブロッキング コレクションに相当する変数はありますか? 私が望むのは、すべてのスレッドが共有変数にアクセスできるようにすることです。これはコレクションではなく、各スレッドが使用するたびに値が調整される単なる共有変数です。ブロッキングコレクションについて私が気に入っているのは、クエリとロックが C# によって管理されていることです。変数だけに似たようなものがあることを望んでいましたか?
public static 変数を使用して自分でロックを作成することもできましたが、確認する必要があると考えました。
編集:インターロックは可能でしょうか。