2009-03-31 18 views
0

私は(C#で)作成しているプログラムを持っていて、2つのアプローチがあります..新しいスレッドを作成するかスレッドのためにもっと多くの作業をする

1)Xスレッド仕上げに、終わったときに、それは仕事の次のチャンクを取得し、新しいスレッドを作成し、それを我々はXスレッドが起動するために作成

または

2)そのチャンクを与え、それら各に仕事のチャンクを与える、とするときスレッドはチャンクを終了します。チャンクはジョブマネージャにもっと多くの作業を要求します。それ以上の仕事がなければ、それは眠り、次に尋ね、睡眠は徐々に長くなる。

このプログラムは実行され、実行されます。それで、私はそれが継続的により多くの仕事を探すサービスに変わっていくのが分かります。

各チャンクは、いくつかの情報を取得したり、データIDに対して操作を実行したり、データIDのデータベース情報に書き込んだりするためのデータベースへの呼び出しで構成されます。

+0

解決方法1を明確にするために、スレッドが終了するのを待ってから、新しいスレッドを作成し、実行すべき作業があればそのスレッドにもっと多くの作業を渡します。 –

+0

これを考えると、しかし、スリープチェックスリーププロシージャではなく、最後にスレッドが作業項目を要求するようにしてください。それがなければ、無期限に眠る。それから、あなたのコーディネーターに眠っているスレッドを見つけて、そのうちの1人に目を覚ますように知らせてください。 –

答えて

2

マルチスレッドデータベース操作を扱う際に注意する必要があることを前提とすると、2つの異なるシナリオを説明しているように思えます。最初は、いくつかのスレッドが実行されており、それらのすべてが終了すると、新しい作業が検索されます。 2番目の方法では、いくつかのスレッドを実行しており、それらの操作は完全に並列です。あなたの環境は、適切なアプローチを決定するものになるでしょう。追加の作業がすべて完了するまで続けることができないいくつかのスレッドにすべての作業を結びつける何かがある場合は、前者を使用します。彼らがお互いに大きな影響を及ぼさなければ、後者と一緒に行く。

-1

.NET FrameworkのThreadPoolクラスは、独自のソリューションを使用する代わりに、.NET Frameworkで参照する必要があります。 QueueUserWorkItemメソッドを使用できます。それはあなたが達成したいことを正確に行うべきです。

+0

@EFrank:仕事が長時間続く場合は、それは良い考えではありません。 – casperOne

+0

@EFrank(+1からcasperOne):ThreadPoolクラスはシステムスレッドを使用し、短いライフサイクル(およびまれに使用される)の操作用に設計されています。より多くの要求がある場合は、独自のスレッドを作成する必要があります。 –

1

2番目のオプションは本当に適切ではありません。スリープ時間が徐々に長くなるということは、それらのスレッドを不必要にブロックし続けることを意味します。

2番目のオプションのようにプールされたスレッドセットが必要ですが、WaitHandlesを使用して作業を待機し、プロデューサ/コンシューマパターンを使用します。基本的には、プロデューサが作業があることを示すと、消費者に信号を送ります(作業を開始するスレッドを決定し、そのスレッドを通知するマネージャが存在します)。

パラレルタスクライブラリを調べるとよいでしょう。今はベータ版ですが、あなたがそれを使いこなすことができ、それに慣れていれば、私はそれをお勧めします。これは、あなたのためにこれを大量に管理します(そして、マシン上のコア数、最適なスレッド数など)。

+0

PTLの問題は、それがCPUを最大限にすることであり、より多くのDBバインドが必要なので、thrの数をより密接に管理する必要があります。 P/Cパターンはオプション1です。スレッドが終了した後に新しいthrを作成する代わりに、スリープ状態になり、pは待機しているスレッドを探してより多くの作業を送信します。 –

1

作業の単位が十分大きい場合は、以前の解決策(新しい作業ごとにスレッドを生成する)は、コード作成が容易であり、悪くないわけではありません。

第2の解決策(作業待ち行列を有するスレッドプール)は、コード作成がより複雑であるが、より小さい作業単位をサポートする。

関連する問題