私は.NET 2.0で次のコードを書きました
foreach(Item i in millonItemsIterator) {
ItemThreadManager m = new ItemThreadManager(i);
System.Threading.Thread t = new System.Threading.Thread(m.Process);
t.Start()
}
SendCompletionEmail();
public class ItemThreadManager {
private static Semaphore s = new Semaphore(20, 20);
private Item item = null;
public ItemThreadManager(Item i) {
item = i;
}
public void Process() {
s.WaitOne();
// do something with item.
s.Release();
}
}
セマフォ アプローチを使用する背後にある意図は、millionItems リスト内のアイテムを 20 個のバッチで処理することでした。
しかし、100 万件のアイテムがすべて処理されるまでメールを送信したくありません。上記のコードは、処理が完了する前にメールを送信しています。
私の理解では、上記のコードは一度に 20 アイテムしか処理しません。20 個のスレッドすべてが使用されている場合はブロックされます....しかし、最後の 20 個のスレッドについては....それらが完了するのを待たずに、直接電子メールを送信します。では、最後の 20 については、Join をどのように実装すればよいでしょうか?
私の理解は正しいですか?