对不起,标题有点蹩脚,我无法准确地表达它。
编辑:我应该注意这是一个控制台 c# 应用程序
我已经制作了一个像这样工作的系统的原型(这是粗略的伪代码):
var collection = grabfromdb();
foreach (item in collection) {
SendAnEmail();
}
发送电子邮件:
SmtpClient mailClient = new SmtpClient;
mailClient.SendCompleted += new SendCompletedEventHandler(SendComplete);
mailClient.SendAsync('the mail message');
发送完成:
if (anyErrors) {
errorHandling()
}
else {
HitDBAndMarkAsSendOK();
}
显然这种设置并不理想。如果初始集合有 10,000 条记录,那么它将以相当短的顺序新建 10,000 个 smtpclient 实例,并尽可能快地遍历行 - 并且可能会在此过程中加速。
我理想的最终结果是同时发送 10 封并发电子邮件。
想到一个 hacky 解决方案:添加一个计数器,当 SendAnEmail() 被调用时递增,当 SendComplete 被发送时递减。在初始循环调用 SendAnEmail() 之前,检查计数器,如果它太高,则休眠一小段时间,然后再次检查。
我不确定这是一个好主意,并且认为 SO 蜂巢思维有办法正确地做到这一点。
我对线程知之甚少,不确定它是否适合在这里使用。例如,在后台线程中发送电子邮件,首先检查子线程的数量以确保没有使用太多。或者,如果内置某种类型的“线程节流”。
更新
按照 Steven A. Lowe 的建议,我现在有:
- 包含我的电子邮件和唯一键的字典(这是电子邮件查询
- 填充字典的 FillQue 方法
- ProcessQue 方法,它是一个后台线程。它检查队列,并发送队列中的任何电子邮件。
- 从队列中删除电子邮件的 SendCompleted 委托。并再次调用 FillQue。
我对这个设置有一些问题。我想我错过了背景线程的船,我应该为字典中的每个项目生成其中一个吗?如果电子邮件队列清空线程结束,我怎样才能让线程“闲逛”,因为没有更好的词。
最终更新
我在后台线程中放置了一个“while(true) {}”。如果 que 是空的,它会等待几秒钟,然后再试一次。如果 que 反复为空,我会在此期间“中断”,然后程序结束......工作正常。不过,我有点担心“while(true)”的业务。