我在.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?
我的理解是否正确?
答案 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