5

一度に最大25KBのデータを受け入れるサードパーティのコンポーネントを使用しています。オブジェクトの配列をアプリケーションからこのサードパーティコンポーネントに渡します。

ただし、私のアプリケーションが書き込むデータの量は25KBをはるかに超えています。データベースからデータを取得し、コンポーネントを直接呼び出しています。

アプリケーションにコンポーネントの参照を追加しました。プリミティブ型と非プリミティブ型を含むオブジェクトの配列としてコンポーネントに渡すデータ。

ここでデータスロットリングを実装するにはどうすればよいですか?

4

3 に答える 3

5

データベースの1行のサイズを計算できます。その後、何かを渡すたびに、そのサイズを変数に追加します。同時に、実行されるストップウォッチを使用しています。Stopwatch.EllapsedSecondsが1秒より大きいかどうかを確認してください。はいの場合、ストップウォッチをリセットし、すでに通過したサイズで変数をリセットします。渡したサイズ(変数の量)が25KBより大きいかどうかを確認しない場合。それが本当なら、を呼び出しますSystem.Thread.Thread.Sleep(Math.Max(1000 - StopWatch.EllapsedMilliseconds, 0))。ただし、スリープによってスレッド全体がブロックされるため、追加のスレッドでこれを行う必要があることを忘れないでください。

于 2012-08-27T09:25:13.853 に答える
3

アプリとコンポーネントの間にデータバッファーを実装する必要があります。そのための最良の方法は次のとおりです。

  • 独自の内部スレッドを持つクラスを作成し、
  • クラスのインターフェイスのパブリック部分に、バイト配列を受け入れてキューに格納するWriteメソッドを実装します
  • 内部スレッドは、キューから最大25kbのデータのチャンクを書き込み、チャンクの書き込みにかかった時間を差し引いて1秒間スリープします。

また、データストリームが継続的で、25kbpsを超えるレートで生成される場合は、コンポーネントが消費できる量を超えて生成し、キューがオーバーフローすることに注意する必要があります。

于 2012-08-27T09:29:42.580 に答える
2

MSDNのBufferedStreamクラスの例をご覧ください。1秒あたり最大25KBを書き込むように調整できるはずです。

ストリームに書き込むときは、読み取り/書き込みするデータサイズを指定するため、書き込み25KBと言って24KBを返す場合でも、1Kを書き込むことができます。

25KBで戻ってきても、バッファに未処理のデータが残っている場合Thread.Sleep(1000)は、クォータを超えないようにすることができます。

于 2012-08-27T09:40:00.070 に答える