1

ジョブを処理するWindowsサービスがあります。このサービスのジョブは、次のような一連のアクションです。

A-> B-> C-> D-> E

各ジョブは、他のジョブから完全に独立している必要があります。現在の実装では、各ジョブを独自のスレッド(この場合はnew System.Threading.Thread)で処理します。これはほとんどの場合うまく機能します。ただし、Bアクションはスレッドセーフではなく、2つのスレッドがBアクションを同時に処理するべきではないことがわかりました。2つのスレッドが同時にBアクションを実行しようとすると、奇妙な結果やエラーが発生することがあります。他のアクションは、悪影響を与えることなく複数のジョブによって同時に実行される可能性があることに注意してください。

スレッドセーフな方法でBアクションを再実装しようとするのではなく(実装とテストに大量のリソースが必要になると予想されます)、各Bアクションを一度に1つのスレッドに制限したいと思います。 。

今、私にとって明らかな最初の解決策はlock、Bアクションを回避することでした。これにより、確実に単一のスレッドに制限されます。ただし、このソリューションでは、待機中のすべてのスレッドがBアクションを処理する機会が得られるとは限らないようです。これは、スレッドがFIFOまたは一貫した方法でキューに入ることが保証されていないためです。これは理論的にはスレッドの枯渇につながる可能性があると思います。したがって、私はこのソリューションを実装することに抵抗があります。

だから私の質問は、すべてのジョブが1つずつBアクションを通過することを保証するより良い(おそらくFIFO)ジョブキューを.NETに実装するにはどうすればよいですか?

私の現在の考えは、キューからジョブスレッドをプルし、Bアクションがクリアされたときにそれを実行することを目的とした、ある種の「マネージャー」スレッドを維持できるというものです。(おそらく、私は自分のスケジューラーの実装について説明していますか?)しかし、それはかなり粗雑であり、おそらく.NET(.NET 4.0を使用しています)のライブラリーには、このシナリオに適したツールがあります。

4

2 に答える 2

2

あなたが求めているのは、クリエーターとコンシューマーのパターンに沿ったものです。このスタックオーバーフローの投稿には、ブロッキング キューの優れた実装があります。したがって、複数のスレッドに何かを追加させることができ、1 つのスレッドだけがそこから何かを永久に読み取ることができます (キューが空になるとブロックされます)。

于 2013-01-03T18:15:42.713 に答える
1

Windowsワークフローhttp://msdn.microsoft.com/en-us/vstudio/jj684582.aspxまたはQuartz.net http://quartznet.sourceforge.net/のいずれかを見てください

于 2013-01-03T18:16:32.550 に答える