【发布时间】:2011-07-03 19:46:39
【问题描述】:
我正在尝试设计一个多线程的 windows 应用程序,主要是为我们的客户快速发送电子邮件给他们的客户(可能有数百万,因为有一家大型电信公司),我需要设计提示。(我很抱歉 Q很长)
我相当阅读有关多线程应用程序的文章。我还阅读了有关 SmartThread Pool、.NET ThreadPool、Task Parallel Library 和其他 SO 问题的信息。但我无法提供正确的设计。我的逻辑是这样的:
在程序启动时(电子邮件引擎),计时器启动并检查数据库(活动表)中是否有状态为 1(新活动)的电子邮件活动。
如果有,则应从 DB 中查询 Campaign 订阅者,并将其写入另一个名为 SubscriberReports 表的表 (SqlBulkCopy),并在 Campaigns 表中将 Campaign 的 Status 更新为 2。
Timer 还侦听状态为 2 的活动,以调用另一个方法为每个订阅者自定义活动,创建一个具有订阅者自定义属性的结构。
第三,调用 SendEmail 方法通过 SMTP 发送电子邮件。到目前为止我尝试的内容如下(我知道 ThreadPool 在这里是错误的,而且我还有很多其他错误)。您能否建议并帮助我如何设计这样的应用程序。非常感谢任何帮助。非常感谢您的宝贵时间。
private void ProcessTimer(object Source, ElapsedEventArgs e)
{
Campaigns campaign = new Campaigns();
IEnumerable<Campaigns> campaignsListStatusOne = // Get Campaign Properties to a List
IEnumerable<Campaigns> campaignsListStatusTwo = // Get Campaign Properties to a List
foreach (Campaigns _campaign in campaignsListStatusOne)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(CheckNewCampaign), _campaign.CampaignID);
}
foreach (Campaigns _campaign in campaignsListStatusTwo)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(CustomizeMail), _campaign.CampaignID);
}
}
private void CheckNewCampaign(object state)
{
int campaignID = (int)state;
DataTable dtCampaignSubscribers = // get subscribers based on Campaign ID
campaign.UpdateStatus(campaignID, 2);
}
private void CustomizeMail(object state)
{
int campaignID = (int)state;
CampaignCustomazition campaignCustomizer;
IEnumerable<SubscriberReports> reportList = // get subscribers to be sent from Reports table
foreach (SubscriberReports report in reportList)
{ // 3 database related methods are here
campaignCustomizer = new CampaignCustomazition(report.CampaignID, report.SubscriberID);
campaignCustomizer.CustomizeSource(report.CampaignID, report.SubscriberID, out campaignCustomizer.source, out campaignCustomizer.format);
campaignCustomizer.CustomizeCampaignDetails(report.CampaignID, report.SubscriberID, out campaignCustomizer.subject, out campaignCustomizer.fromName, out campaignCustomizer.fromEmail, out campaignCustomizer.replyEmail);
campaignCustomizer.CustomizeSubscriberDetails(report.SubscriberID, out campaignCustomizer.email, out campaignCustomizer.fullName);
ThreadPool.QueueUserWorkItem(new WaitCallback(SendMail), campaignCustomizer);
}
}
private void SendMail(object state)
{
CampaignCustomazition campaignCustomizer = new CampaignCustomazition();
campaignCustomizer = (CampaignCustomazition)state;
//send email based on info at campaignCustomizer via SMTP and update DB record if it is success.
}
【问题讨论】:
-
先尝试写应用单线程,然后看看性能是否足够好。如果不是,请考虑如何改进代码,例如将电子邮件写入放置目录而不是连接到 smtp 服务器。重写您对数据库的访问,获取批次而不是单个记录。并处理您的交易。
标签: c# winforms multithreading threadpool task