0

これはここではふさわしくないかもしれません。その場合は、自由に移動したり、叫んだり、罵倒したりしてください。

現在、別のアプリケーションによって開始され、「ジョブ」の ID で渡されるコンソール アプリケーションがあります。このジョブには、処理が必要な複数のレコードがあります。フローの簡単な説明は次のとおりです。

Starts 50 threads

Gets records to be processed.
if records > 0 see what threads are not still busy and send it some information.
if records = 0 update something else and exit.
Get more records.
Loop.

現在、これを継続的に実行されている「ポーリング」サービスに変換し、新しいレコードが利用可能になったときにそれらを処理することを検討しています。私が持っているものを変換するのはかなり簡単ですが、スレッドのものは古く、おそらく時代遅れです。

すべてではないにしてもほとんどをリファクタリングし、Task.Parallel を使用してアイテムを処理しようとしていました。ただし、ポーリングしてアイテムを処理するための適切なフレームワークを取得するのに苦労しており、これを達成する方法についての提案を探していました。

かなり漠然としていますが、何らかの情報を提供できることを願っています。

どうもありがとう

4

3 に答える 3

1

私の経験とこのmsdnの引用から:

システムリソースのより効率的でスケーラブルな使用。

舞台裏では、タスクはThreadPoolにキューイングされます。これは、スループットを最大化するスレッドの数を決定および調整するアルゴリズム(山登り法など)で拡張されています。これにより、タスクが比較的軽量になり、それらの多くを作成して、きめ細かい並列処理を可能にすることができます。これを補完するために、広く知られているワークスティーリングアルゴリズムを使用して負荷分散を提供します。

タスクの数が適切な数であることや、関連するスレッドの負荷を分散するシステムを作成する方法を気にする必要はありません。

単に使用してください:

Task.Factory.StartNew(() => DoSomeWork());

非同期で何かを実行したいときはいつでも、それはカーテンの後ろですべての賢い仕事をします。

ループでタスクを作成する可能性が高いので、ここで調べることができる多くの人(私を含む)が持っていたクロージャーバグを導入しないように特に注意してください。

1から500のタスクを実行するWindowsサービスがあり、問題は発生していません。

お役に立てれば、

バブ。

于 2012-04-25T14:12:07.603 に答える
1

DB テーブルで新しいレコードをポーリングしている場合、このテーブルに INSERT トリガー (場合によっては UPDATE および DELETE トリガーも) をインストールし、新しいレコードが作成されたときにサービスにメッセージを送信することをお勧めします。挿入されます。

MSDNの「 SQL Server から MSMQ へのメッセージの投稿」を参照してください。

于 2012-04-25T14:21:53.860 に答える
0

「ポーリング サービス」は、監視可能なコレクションの良い例のように思えます。それらを処理する良い方法である Rx (http://rxwiki.wikidot.com/101samples) があり、これは TPL を使用していると思います。

于 2012-04-25T14:21:31.283 に答える