質問

私はモデル(APM)イディオムを(例えば、BeginRead / EndRead)プログラミング非同期を使用してC#で書いたいくつかの高性能ファイル転送コードを持っています。このコードは、ローカルディスクからファイルを読み込み、ソケットに書き込みます。

は最新のハードウェア上で最高のパフォーマンスを得るために、それは可能な限り飛行中に複数の未処理のI / O操作を維持することが重要です。 1つの完了が、私はソケットにBeginReadを呼び出すとき、その完了が、私は、ファイル上の別のBeginSendを行うときにこのように、私はその後、ファイルにいくつかのBeginRead操作を投稿してください。詳細は、もう少し複雑なことはなくアイデアだハイレベルによります。

私はAPMベースのコードの作業を持っているが、それは従うことが非常に困難だと、おそらく微妙な並行処理のバグがあります。私の代わりに、このためにTPLを使用してみたいです。私考え出しTask.Factory.FromAsyncはちょうど約それを行うだろうが、キャッチはあります。

私が見てきたI / Oサンプルの

すべての(パラレル拡張エクストラで最も特にStreamExtensionsクラス)は1が1個の書き込みに続いて読み出しを前提としています。これは、双方向Iの必要性を実行しません。

非同期I / Oタスクは、ワーカースレッドに多くの時間を費やすことはありませんので、私は、潜在的に数十または数百人で、その結果、別のタスクを起動するパラレルので、Parallel.ForEachまたはエクストラ拡張Task.Factory.Iterateのようなものをシンプルに使用することはできません保留中のI / O操作。あまりにも多くの!あなたの仕事にWaitingでいることを回避することができますが、それはイベントハンドル(カーネルオブジェクト)の作成を引き起こし、タスク待ちハンドルに、ブロック待機、ワーカースレッドアップネクタイ。私のAPMベースの実装は、それらのものの両方を回避します。

「doesnの間違い私は、飛行中に複数の読み取り/書き込み操作を維持するためにさまざまな方法で遊んでてきた、と私は別のタスクを作成するメソッドを呼び出し継続を使用して、そうするために管理してきましたが、それはぎこちない感じている、と慣用TPLのようなトン感触ます。

誰がTPLで、このような問題に取り組んていますか?任意の提案ですか?

役に立ちましたか?

解決

あなたはあまりにも多くのスレッドを心配している場合は、することができますParallelOptions.MaxDegreeOfParallelismへのお電話での許容数にちょうどセットParallel.ForEachます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top