タスク並列ライブラリでI / O非同期(async)実行するための提案
-
26-09-2019 - |
質問
私はモデル(APM)イディオムを(例えば、BeginRead
/ EndRead
)プログラミング非同期を使用してC#で書いたいくつかの高性能ファイル転送コードを持っています。このコードは、ローカルディスクからファイルを読み込み、ソケットに書き込みます。
は最新のハードウェア上で最高のパフォーマンスを得るために、それは可能な限り飛行中に複数の未処理のI / O操作を維持することが重要です。 1つの完了が、私はソケットにBeginRead
を呼び出すとき、その完了が、私は、ファイル上の別のBeginSend
を行うときにこのように、私はその後、ファイルにいくつかのBeginRead
操作を投稿してください。詳細は、もう少し複雑なことはなくアイデアだハイレベルによります。
私はAPMベースのコードの作業を持っているが、それは従うことが非常に困難だと、おそらく微妙な並行処理のバグがあります。私の代わりに、このためにTPLを使用してみたいです。私考え出しTask.Factory.FromAsync
はちょうど約それを行うだろうが、キャッチはあります。
すべての(パラレル拡張エクストラで最も特にStreamExtensions
クラス)は1が1個の書き込みに続いて読み出しを前提としています。これは、双方向Iの必要性を実行しません。
私は、潜在的に数十または数百人で、その結果、別のタスクを起動するパラレルので、Parallel.ForEach
またはエクストラ拡張Task.Factory.Iterate
のようなものをシンプルに使用することはできません保留中のI / O操作。あまりにも多くの!あなたの仕事にWait
ingでいることを回避することができますが、それはイベントハンドル(カーネルオブジェクト)の作成を引き起こし、タスク待ちハンドルに、ブロック待機、ワーカースレッドアップネクタイ。私のAPMベースの実装は、それらのものの両方を回避します。
私は、飛行中に複数の読み取り/書き込み操作を維持するためにさまざまな方法で遊んでてきた、と私は別のタスクを作成するメソッドを呼び出し継続を使用して、そうするために管理してきましたが、それはぎこちない感じている、と慣用TPLのようなトン感触ます。
誰がTPLで、このような問題に取り組んていますか?任意の提案ですか?
解決
あなたはあまりにも多くのスレッドを心配している場合は、することができますParallelOptions.MaxDegreeOfParallelism
へのお電話での許容数にちょうどセットParallel.ForEach
ます。