2012-04-25 5 views
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を使用してアイテムを処理しようとしていました。しかし、私はアイテムをポーリングして処理するための適切なフレームワークを得るのには苦労しており、これを達成するための提案を探していました。

私は知っていますが、うまくいけば何らかのインプットを与えることができます。

多くのおかげで、私の経験から

+0

これらのレコードの元の場所を説明できますか?彼らはデータベースに追加されますか? –

+0

現在のところリストですが、最終的にDBから来ています。それらは1000のバッチでロードされ、スレッドプールに送られます。そのバッチに処理されるものが残っていなければ、より多くをチェックします。 – ChrisBint

+0

これはSQL Serverとの話ですか? –

答えて

1

このmsdn引用:システムリソースの

より効率的で、よりスケーラブルな使用。

バックグラウンドでは、タスクは、 アルゴリズムを拡張(山登りのような)し、 スループットを最大にするスレッド数に調整されているThreadPoolにキューに入れられます。これにより、比較的軽量の タスクが作成され、細かい並列処理を可能にするために多くのタスクを に作成できます。これを補うために、広く知られている ワーク・スチール・アルゴリズムがロード・バランシングを提供するために採用されています。

いいえ、いくつかのタスクが関心事ではありません。関連するスレッドの負荷を分散するシステムを作成する方法は簡単です。

は単純に使用します。

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

あなたが非同期的に何かを実行するたびに、それはカーテンの背後にあるすべてのスマート仕事をしていません。

あなたがループ内でタスクを作成する可能性が高いしているので、は、多くの人々はあなたがhereを調べることができた、(私を含め)持っていた閉鎖バグを導入していないエクストラように注意してください。

私は1から500のタスクを実行するWindowsサービスを持っていて、問題は一度もありませんでした。

希望します。

Bab。

+0

500タスクは大丈夫かもしれませんが、10000のようなものはわかりません。 – svick

0

"ポーリングサービス"は、観測可能なコレクションにとって素晴らしいケースのようです。 Rx、それらを扱う良い方法(http://rxwiki.wikidot.com/101samples)があります。これはTPLを使うと思います。

1

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

MSDNのPosting Message to MSMQ from SQL Serverを参照してください。

+0

+1トリガ。 DBをお持ちの場合は、その機能を使用することもできます。 –

関連する問題