私はWindowsサービス(C#.NET 3.5 VS2008を使用)を書いており、私の要件は次のとおりです。
Windowsサービスの開始時-30秒間隔で(データベースで)レコードチェック操作を実行します(このためにタイマーを使用しました)
適切なレコードがデータベース内で見つかった場合-複数のスレッドを開始し、必要な操作(ネットワーク操作またはデータベース操作など)を実行します。
マルチスレッドの数は、見つかったレコードの量にも依存します(たとえば、10レコードが見つかり、5スレッドが開始され、20レコードが10スレッドを開始する場合など)。これらの複数スレッドの設計/コーディング方法は?
例:データベースで10レコードが見つかりました。ネットワーク操作を実行する可能性がある最初の5レコードに対して5つのスレッドを開始します... 5つのスレッドのうち、スレッドが彼のジョブを完了すると、次のレコード(つまり、レコード番号6)の処理が開始されます。 7 ... 10)
上記のケースに最適な解決策を提案してください。
明示的なマルチスレッドではなく、Parallel.NetとPLINQを使用することをお勧めします。管理が簡単で軽量であり、コアの数に適応します
サービスの開始時に、タイマープロセスを実行するスレッドを起動します
サービス終了時に、開いているすべてのスレッドを強制終了します
anyプロセス内の未処理の例外がタイマースレッドを暗黙的に強制終了することに注意してください
サービスのフラッディングを回避するために、プライベートリストを使用して許可されるオープンスレッドの数を調整する
あなたは私の SafeThread クラスがこれに役立つと思うかもしれません
当初の考え:スレッドが多すぎると不都合です。スレッドがIOバインドされていない場合(つまり、大量の時間を待機しているIO操作の場合))でない限り、おおよそのCPUあたり2つのスレッドが必要です。経験則。
再利用として、固定数のスレッドのスレッドプールを作成し、単純に再利用します。プールの設計にはセマフォが必要です-セマフォカウントをプール内のスレッドの数に設定し、セマフォがカウントするまでの数のリクエストを許可します。その後、セマフォはスレッドが完了するまでブロックします(これが発生すると、セマフォカウントをデクリメントします)。これにより、次の要求が通過できるようになります。セマフォは単に「マルチロック」ミューテックスなので、これは機能します。指定した数の呼び出しを通過させてからブロックします。ミューテックスは、実際にはカウントが1のセマフォです。