問題タブ [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# - foreach は C# BlockingCollection から削除されますか?
たとえば、BlockingCollection.Take() と同じように、C# BlockingCollection<> を反復処理するときに要素がコレクションから取得されるかどうかは誰にもわかりませんか?
ありがとう
編集: もちろん、私は BlockingCollection を意味していましたが、何らかの理由で BlockingQueue を頭に入れ、それを使用しました。
c# - BlockingCollection キューがバックグラウンド スレッドによってクリアされるまで待機し、時間がかかりすぎる場合はタイムアウトしますか?
C# では、BlockingCollection がバックグラウンド スレッドによってクリアされるまで待機することが可能かどうか疑問に思っています。時間がかかりすぎる場合はタイムアウトします。
現時点で私が持っている一時的なコードは、やや洗練されていないように思えます (いつから使用するのが良い習慣なのThread.Sleep
でしょうか?):
.net - BlockingCollection / ConcurrentQueue 消費遅延を修正するには?
ハイパースレッディングが有効になっている Windows7 クアッドコアでは、何百ものスレッドが通信してBlockingCollection<T>
います (すべてデフォルトのコンストラクターで初期化されているため、ConcurrentQueue<T>
内部で使用されます)。
すべてのスレッドは、1日に 4 から 20 のメッセージしか受信しないスレッドを除いて、毎秒 10 から 100 のメッセージを受信します。
私の問題は、この最後の消費者に関連しています。ほとんどの場合、新しいメッセージを待つためにブロックされますが、メッセージを消費する準備ができたら、できるだけ早く、おそらく即座に処理する必要があります。
問題は、メッセージがBlockingCollection
このコンシューマー専用に追加されると、数秒後に受信されることです (Take() は、メッセージがエンキューされてから 3 秒から 12 秒後に返されます)。
問題は、Windows がこのスレッドをスケジュールする方法に関連していると思います。
この消費者の ThreadPriority を改善せずに上げようとしました。次に、プロセッサのアフィニティを専用コアに設定しようとしました。他のすべてのスレッドのアフィニティを他のコアを使用するように変更しましたが、まだ改善されていません。
どうすればこの問題に対処できますか? 実際の問題は何ですか?
これはスレッド ループです (commands
は ですBlockingCollection
):
保留中のメッセージがない場合、を直接使用する必要ConcurrentQueue
がありますか?
CPU が 50% を超えて使用していないことに注意してください。
遅延については、ログによると、(ほとんどの場合)「Dispatched: ...」と「Waiting for command」の間に数秒が経過しています。(aka on commands.IsCompleted
) と "Waiting for command" の間の他のいくつか。および「受信: ...」 (別名 on commands.Take()
)
すべての「健全な」スレッドは I/O バウンドですが、協力しています。信じてください。私はそれらの設計を変更することはできません。ただし、それらはかなりうまく機能します。唯一の誤動作は、別の種類の作業を行う低負荷スレッドです。スレッドの優先度が悪であることは知っていますが、より良い解決策が見つかりませんでした。
問題を (ほぼ) 再現するテスト サーバー上で、問題をほぼ
再現
するテストを次に示します。テストでは CPU に負荷がかかる (すべて 100% になる) ため、「ほぼ」ですが、実際のアプリケーションではすべての CPU が 50% 未満です。
何か案は?
c# - スレッド化とタイマーでの奇妙な動作
私は自分の状況を説明します。
私はプロデューサ1からNコンシューマパターンを持っています。ブロッキング コレクションを使用していますが、すべて正常に動作しています。いくつかのテストを行って、この奇妙な動作に気付きました:
私は、消費者のデータ操作にかかる時間をテストしていました。この奇妙なことに気付きました。以下に、私の操作が削除され、奇妙な動作を引き起こすコードが表示されます。
1 つのプロデューサーに対して 4 つのコンシューマーがあります。ほとんどのデータについて、コンソールは何も出力しません。これは ts=0 (目盛りの下) であるためですが、ランダムに (1 から 5 秒ごとに) 次のようなものをプロットします (この非常に特定の順序ではなく、同じ種類の) ):
約 10,000 ティックなので、約 1 ミリ秒です。常に (N)000(N-1) の形式の数値です。使用する BlockingCollection は、完全にランダムな時間に発生したいくつかのネットワーク イベントに応じて満たされることに注意してください。ここから通常のものはありません。
タイミングはほぼ完璧で、常に 10,000 ティックの倍数です。
この背後には何がありますか? ありがとう!
c# - ブロック コレクション - 特定の要素を削除する
このリストをスレッドセーフにする必要があるため、ブロッキングコレクションを使用しています。
特定の注文を削除しようとしています。削除したいとしましょう。order.ID 1
それが通常のコレクションであれば、次のようなものになります
そこにあるコレクションについて読んだことがありTake()
ますTryTake()
が、どのコレクションを削除するかを指定することはできません。
c# - Loggly への Web サイトの非同期投稿
Loggly へのアプリケーション ロギング用の非同期ロギング ソリューションを作成する方法を考えています。Loggly's ducumentationを見て、これを古典的な生産者と消費者の問題と考えて、私はこれを思いつきました:
データの JSON シリアル化に使用するメッセージ モデル:
ログに記録する必要があるものすべてに渡される Logger クラス ( などExceptionFilter
)。これは、BlockingCollection
Loggly に送信するメッセージをキューに入れるために を使用します。
ここに私の質問があります:
- を設定するこのパターンに何か問題があり
BlockingCollection
ますか? - JSON.Net は の正しいサブクラスを見つけ出します
LogMessage
か、それとも別の方法でメッセージを送信する必要がありますか? - 例外を飲み込むのは間違いなくコードの匂いですが、ロガーがメッセージの送信に失敗した場合に何が起こるかわかりません。何かご意見は?
よろしくお願いします。
vb.net - VB.NET の基本的な BlockingCollection プロデューサー コンシューマー
ここ数時間、BlockingCollection の基本的な実装を機能させるのに苦労してきました。私の人生ではVB.NETでチュートリアルを見つけることができないようです。そのため、C#のチュートリアルから何かを動かそうとしています。
基本的な実装を機能させたいだけなので、実際に必要なことに進むことができます。しかし、私は立ち往生しています。
これは現在私のコードです:
これを実行しても出力は得られません。次の例外のみです。
タイプ 'System.FormatException' の最初の例外が mscorlib.dll で発生しました タイプ 'System.FormatException' の最初の例外が Microsoft.VisualBasic.dll で発生しました.dll
私はこれを解決しようと過去数時間、しつこくグーグルで検索してきましたが、役に立ちませんでした。うまくいけば、ここの誰かが助けてくれるでしょう。
ありがとう
c# - パラメータをサポートするカスタム メッセージ ポンプを追加するにはどうすればよいですか?
これは、次の質問に関連しています: カスタム メッセージ ポンプを作成するには?
基本的に同じメッセージ ポンプが必要ですが、入力パラメーターもサポートできる必要があります。上記の質問からの回答は、パラメーターを受け入れない Action() デリゲートのみをサポートします。アクションにパラメータを渡せるようにしたい。パラメータなしのバージョンは次のとおりです。
これを行う正しい方法は何ですか?BlockingCollection に Action の代わりにカスタム クラスを格納することを考えていました。
しかし、それは不格好に思えます。加えて、action(parameter) を呼び出せるようにするために、アクションを取得するときにパラメータの型を把握するための switch ステートメントも必要になります。また、複数のパラメーターをサポートしたい場合はどうすればよいですか? 私はobject[] parameters
それを使用する必要がありますか?きっともっと良い解決策がありますか?