6

C# を使用して開発しているアプリケーション用に、ある種のバッファー管理を開発する必要があります。

基本的に、アプリケーションは、デバイスが着信するたびにデバイスからメッセージを受信します (短時間に多数のメッセージが送信される可能性があります)。それらを管理された方法で処理できるように、ある種のバッファープールにそれらをキューに入れる必要があります。

メモリのブロックを 256 バイトのチャンク (すべてのメッセージはそれよりも小さい) に割り当て、バッファー プール管理を使用して、着信メッセージに使用できる使用可能なバッファーのプールと、処理する準備が整ったバッファーのプールを用意することを考えていました。 .

したがって、フローは「バッファを取得する」(処理する)「バッファを解放する」または「プールに残す」になります。また、バッファーがいついっぱいになるかを知る必要もあります。

潜在的に、常に次のバッファを取得するのではなく、バッファを「のぞき見」して、プール内の最も優先度の高いバッファが何であるかを確認する方法も必要になるでしょう。

これは .NET で既にサポートされていますか、それとも使用できるオープン ソース コードはありますか?

4

5 に答える 5

4

C# Sharps のメモリ管理は実際には非常に優れているため、バッファのプールを用意する代わりに、必要なものを正確に割り当ててキューに入れることができます。バッファの処理が完了したら、ガベージ コレクタに処理させます。

もう 1 つのオプション (アプリケーションについてほとんど知らない場合) は、メッセージを取得したときにメッセージを最小限に処理し、それらを本格的なオブジェクト (優先度とすべてを含む) に変換することです。そうすれば、正しいセットを調査するだけでキューに優先順位を付けることができます。属性またはメソッドの。

最小限の処理でもメッセージの受信が速すぎる場合は、2 つのキュー システムを使用できます。1 つは未処理のバッファーの単なるキューであり、次のキューはバッファーから構築されたメッセージ オブジェクトのキューです。

これが役立つことを願っています。

于 2008-11-11T19:48:13.647 に答える
2

これは古い投稿ですが、ILNumericsプロジェクトに実装されているメモリプールを確認する必要があると思います。彼らはあなたが必要としていることを正確に実行したと思います。それは非常に素晴らしいコードです。http://ilnumerics.net/でコードをダウンロードし、ファイルILMemoryPool.csを見てください。

于 2011-09-10T23:18:03.907 に答える
2

メッセージを受信し、 DeviceMessage (より適切な名前がないため) オブジェクトを作成し、そのオブジェクトを Queue に入れませんか? 優先順位付けが重要な場合は、それを自動的に処理する PriorityQueue クラスを実装します (DeviceMessage オブジェクトをキューに挿入するときに優先順位を付けることによって)。よりオブジェクト指向のアプローチのように見え、優先順位付けに関して、時間の経過とともにメンテナンスが簡素化されます。

于 2008-11-11T19:49:24.640 に答える
2

@grieve: ネットワーキングはネイティブです。つまり、バッファがネットワーク上でデータの送受信に使用される場合、バッファはメモリに固定されます。詳細については、以下の私のコメントを参照してください。

于 2009-12-04T21:58:01.353 に答える
1

私は似たようなことをしています。STA スレッドで処理する必要があるメッセージが MTA スレッドで受信されます。

複数の STA スレッド (構成可能ですが、デフォルトは xr * コア数) によって監視されるBlockingCollection (並列 fx 拡張機能の一部)を使用しました。各スレッドは、メッセージをキューからポップしようとします。タイムアウトして再試行するか、メッセージを正常にポップしてサービスします。

キューの設定を微調整するために使用できる、アイドル時間、ジョブの長さ、受信メッセージなどを追跡するために、perfmon カウンターを接続しました。

キュー アイテムの優先度を実装するには、カスタム コレクションを実装するか、おそらく BC を拡張する必要があります。

私がこのように実装した理由の 1 つは、私が理解しているように、キューイング理論は一般に単一行の複数サーバーを支持するためです (なぜ私はそれについてがらくたを捕まえる気がするのでしょうか?)。

于 2008-11-11T21:14:00.197 に答える