2015-12-25 13 views
5

私は教授から解決する面白い練習をしています。しかし、私はちょっとした助けが必要なので、休暇中に退屈になることはありません。マルチスレッドロードバランサの作成を開始するにはどうすればよいですか?

運動は

  • 5つのセンサー毎秒1から測定点を読み込み、マルチスレッドロードバランサを作成しています。 (したがって毎秒5つの値)。
  • 次に、これらの値で「複雑な」計算を行います。
  • 画面上での計算結果の印刷。 (センサの最大値や平均値など - マルチスレッドのように1-5など)
  • 将来的に例え500個のセンサが毎秒読み取られるならば、ジョブを終了します(ロードバランシング)。

私は5つの虚報センサーから〜400の測定ポイントを持つcsvテキストファイルを持っています。

は、私は私がしなければならないと思う何を:

  1. 配列に測定点をお読み
  2. いくつかの数学のものを算出し、その配列
  3. スポーンすべての値のための新しいスレッドへのスレッドセーフなアクセスを確保私は、マルチスレッドアプリケーションシートに新しいです最大同時作業スレッドの最大値

を設定

  • C#のnsが、私はスレッドプールを使用して右の方法だと思います。私は現在、キューで作業していて、タスク内で起動しているので、アプリケーションをブロックすることはできません。

    お勧めですか?

  • +0

    :-)あなたの教授のための実装の詳細に対処したいと仮定して、私は、ここに任意のコードが含まれていない

    注意? – alexm

    +0

    はい、それは「デザイン」です。それは何とかセンサーを増やすことでスケーリングする必要がありますが、プロセッサを殺すべきではありません.... –

    +0

    以上重要:アプリケーションとその機能を殺すべきではありません –

    答えて

    3

    ここでは、環境の依存関係のカップルがあります。

    • あなたは.NETのどのバージョンを使用しているが?
    • デスクトップ(WPF/WinForms)またはASP.NETのどのUIを使用していますか?

    それが.NET 4.0以上で、デスクトップアプリケーションであるとします。 WPFまたはリサイズアプリケーションでセンサ

    読書

    、Iは、センサからのデータを読み取るために単一BackgroundWorkerを使用します。毎秒500回の読み込みは簡単です - 通常500,00でさえも簡単です。また、BackgroundWorkerタイプは、デスクトップアプリケーションとやりとりするために特別に設計されています。たとえば、スレッドのやりとりを心配することなくUIに結果を渡すことができます。計算

    を処理

    は、その後、あなたは「複雑」な計算を処理する必要があります。これは、これらの計算の有効期間に依存します。彼らが短命であると仮定すると(それぞれ1秒未満と言う)、私はTaskSchedulerと標準ThreadPoolを使っても問題ないと思います。したがって、計算ごとにTaskを作成し、TaskSchedulerにタスクをスレッドに割り当てさせるようにします。

    TaskSchedulerの仕事は、軽量タスクをより重いスレッドにキューイングし、作業負荷とマシン上のコア数のバランスを最適にするためにThreadPoolを管理することによって作業の負荷を分散することです。 override the default TaskSchedulerでも、どのような方法ででもタスクをスケジュールすることができます。

    ThreadPoolは、処理が必要な作業項目のFIFOキューです。 .NET 4.0では、ThreadPoolは作業キューをスレッドセーフのConcurrentQueueコレクションにすることでパフォーマンスを向上させました。

    タスクのスループットと効率を測定

    あなたは、両方のCPU and memory usageを測定するPerformanceCounterを使用することができます。これにより、コアとメモリが効率的に使用されているかどうかがわかります。タスクのスループットは、タスクの処理速度と結果を調べることによって簡単に測定されます。私はあなたがすべてのセンサーのために独立して、最大、平均値を計算するために、あなたがつもりですか

    +0

    こんにちは、ありがとうございます。 コンセプトの証明私は何でも好きなものを選ぶことができます。だからc#.net 4 winformsは私が今働いていることです.... –

    +0

    私はそれを正しく説明しなかったと思います........秒当たりの読み込み量は重要ではなく、重要なことはすべてセンサは少なくとも1秒間に1回読み取られます。ですから、1秒に1回はOKです....タスクを使ってシステムを終了する前にもっとうまくいくかもしれません。 –

    +0

    この例のBackgroundworkerを使用して、すべてのセンサーを読み込んでUIを更新することができます。これは、並列(マルチスレッド)の方法で行う必要がある「複雑な」処理だけです。 – RoadWarrior

    関連する問題