web-dev-qa-db-ja.com

C#.NET Windowsサービスでのマルチスレッド

私はWindowsサービス(C#.NET 3.5 VS2008を使用)を書いており、私の要件は次のとおりです。

  • Windowsサービスの開始時-30秒間隔で(データベースで)レコードチェック操作を実行します(このためにタイマーを使用しました)

  • 適切なレコードがデータベース内で見つかった場合-複数のスレッドを開始し、必要な操作(ネットワーク操作またはデータベース操作など)を実行します。

マルチスレッドの数は、見つかったレコードの量にも依存します(たとえば、10レコードが見つかり、5スレッドが開始され、20レコードが10スレッドを開始する場合など)。これらの複数スレッドの設計/コーディング方法は?

例:データベースで10レコードが見つかりました。ネットワーク操作を実行する可能性がある最初の5レコードに対して5つのスレッドを開始します... 5つのスレッドのうち、スレッドが彼のジョブを完了すると、次のレコード(つまり、レコード番号6)の処理が開始されます。 7 ... 10)

上記のケースに最適な解決策を提案してください。

7
Ankit Shah

明示的なマルチスレッドではなく、Parallel.NetとPLINQを使用することをお勧めします。管理が簡単で軽量であり、コアの数に適応します

学習リソース

http://msdn.Microsoft.com/en-us/concurrency/bb895950.aspx

4
Homde

サービスの開始時に、タイマープロセスを実行するスレッドを起動します

サービス終了時に、開いているすべてのスレッドを強制終了します

anyプロセス内の未処理の例外がタイマースレッドを暗黙的に強制終了することに注意してください

サービスのフラッディングを回避するために、プライベートリストを使用して許可されるオープンスレッドの数を調整する

あなたは私の SafeThread クラスがこれに役立つと思うかもしれません

2
Steven A. Lowe

当初の考え:スレッドが多すぎると不都合です。スレッドがIOバインドされていない場合(つまり、大量の時間を待機しているIO操作の場合))でない限り、おおよそのCPUあたり2つのスレッドが必要です。経験則。

再利用として、固定数のスレッドのスレッドプールを作成し、単純に再利用します。プールの設計にはセマフォが必要です-セマフォカウントをプール内のスレッドの数に設定し、セマフォがカウントするまでの数のリクエストを許可します。その後、セマフォはスレッドが完了するまでブロックします(これが発生すると、セマフォカウントをデクリメントします)。これにより、次の要求が通過できるようになります。セマフォは単に「マルチロ​​ック」ミューテックスなので、これは機能します。指定した数の呼び出しを通過させてからブロックします。ミューテックスは、実際にはカウントが1のセマフォです。

1
gbjbaanb