使用System.Threading.Semaphore批量处理非常大的列表

时间:2013-02-27 11:40:12

标签: c# .net-2.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();
    }
}    

我使用Semaphore方法的意图是我以20个批量处理millionItems列表中的项目。

但我不希望在处理完所有数百万件物品之前发送电子邮件。上述代码在处理完成之前发送电子邮件。

我的理解是上面的代码一次只能处理20个项目。并且如果所有20个线程都在使用中将阻止....但我想最后20个....它不会等待它们完成但是直接发送电子邮件。那么对于最后20个我如何实现Join?

我的理解是否正确?

1 个答案:

答案 0 :(得分: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