2013-02-27 53 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