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 年,我如何实现加入?

我的理解正确吗?

4

1 回答 1

0

要通过调用 SendEmail 使流程按顺序运行,您可以只使用 alock或使用Tasks并链接调用。这是有关操作方法的链接http://msdn.microsoft.com/en-us/library/dd537612.aspx

鉴于它是 .net 2.0 并且您没有并行任务的新信息。使用 aBackgroundWorker运行批处理,然后挂钩它的RunWorkerCompleted事件以了解工作何时完成并且可以发送电子邮件。此处的文档-> http://msdn.microsoft.com/en-US/library/system.componentmodel.backgroundworker_events(v=vs.80).aspx

于 2013-02-27T11:47:28.027 回答