-3

多くのソケットとファイルを開くアプリケーションを書くのが好きです。それをウェブサーバーと考えてください(私の場合はそうではありませんが、ここで問題を単純化するためです)。

Unix で C で書く場合は、poll/select を使用すると非常に効率的になります。複数のスレッドがないため、非常に効率的でありながら、すべてを簡単に記述できます。

複数のスレッドを使用して CPU のすべてのコアを使用する場合 (プロセスを使用したくない場合)、Unix FIFO を使用してメッセージを転送し、各スレッドでポーリング/選択を使用します (ファイル/ソケット/fifos で問題なく動作します)。 /)。非常に効率的でありながら、物事は依然として非常に単純です。

しかし、C# を使用すると、さまざまな選択があり、ほとんどのクラスがそのプログラミング スタイルをまったくサポートしていないように見えます (一例として HttpWebListener)。バックグラウンドで制御できないことが起こっているため、面倒なことは好きではBeginInvokeありません (ThreadPooling、ブロッキング サーバーの正常なシャットダウンなど)。

C# で使用できる select/poll alike フレームワークがあるのだろうか?

4

2 に答える 2

2

実際には、C# で同じアプローチを使用できます。必要なのは、 SelectPollを提供する下位レベルのSocket クラスを使用することだけです。

そうは言っても、より高いレベルのクラスでソケットの上に構築された新しい非同期メソッドには、多くの利点がある傾向があります。それらがどのように機能するかを学び、理解すると、それらは非常に効率的になり、開発するのにかなり適したものになります.

これはスタック全体に拡張されます。「最高レベル」の抽象化はWCFのようなフレームワークであり、多くの種類のアプリケーションの生産性、信頼性、安全性、および開発の容易さの点で大きな利点を提供します。

于 2013-01-29T17:38:19.030 に答える
0

BeginInvoke (または Begin/End パターンに基づくタスク) は、.NET での非同期プログラミングの標準モデルです。実際、継続コールバックがスレッドプールで実行されるように強制します。これでよろしければ、Begin/End モデルは実際には非常に効率的で優れています (コールバック ベースのコードと同じくらい優れています)。

頭のてっぺんから、完了コールバックにスレッドプールを使用したくないという説得力のある理由がわかりません。IOCP を使用して、もう少し効率を絞り出すことができるかもしれません。

選択/ポーリングは、より効率的になる方法ではありません。.NET ソケットはサポートしていますが。

あなたが言った

ブロッキング サーバーを正常にシャットダウンする

問題になるでしょう。理由がわかりません。詳しく教えていただけますか?

于 2013-01-29T17:38:04.423 に答える