2013-02-27 22 views
0
分批一個非常大名單

我已經在.NET 2.0處理使用System.Threading.Semaphore

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個。

但我不希望發送電子郵件,直到所有百萬項已處理。上述代碼在處理完成前發送電子郵件。

我的理解是,上面的代碼一次只能處理20個項目。並會阻止所有20個線程正在使用中......但我認爲對於最後20個......它不會等待它們完成,而是直接發送電子郵件。那麼只需要過去20個月,我如何實施加入?

我的理解是否正確?

回答

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

+0

對不起,我忘了提及,我在.NET 2.0上編寫此代碼。我不認爲該任務類在.NET 2.0中 – 2013-02-27 11:51:18

+1

@KnowsNotMuch然後,而不是一個線程嘗試使用BackgroundWorker,它會給你一個事件觸發完成,然後你可以'SendEmail' – dutzu 2013-02-27 11:54:34