0

私は.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 をどのように実装すればよいでしょうか?

私の理解は正しいですか?

4

1 に答える 1

0

SendEmailの呼び出しでプロセスを順番に実行するには、を使用するlockか、呼び出しを使用Tasksしてチェーンすることができます。ハウツーhttp://msdn.microsoft.com/en-us/library/dd537612.aspxへのリンクは次のとおりです。

.net 2.0であり、並列タスクがないという新しい情報に照らして。を使用しBackgroundWorkerてバッチ処理を実行し、そのRunWorkerCompletedイベントにフックして、作業が完了し、電子メールを送信できるようになるタイミングを確認します。ここのドキュメント-> http://msdn.microsoft.com/en-US/library/system.componentmodel.backgroundworker_events (v=vs.80).aspx

于 2013-02-27T11:47:28.027 に答える