在后台发送大量电子邮件 - 创建线程还是使用ThreadPool?
-
30-09-2019 - |
题
我有一个应用程序,其中一项操作触发了许多要发送的电子邮件。电子邮件的数量可变,可以从10到1,000 每个动作.
我不想申请 悬挂 在发送电子邮件(因此使用户烦恼)并希望将其发送到后台时。
我过去没有使用线程,所以这就是为什么我需要您的帮助。您是手动创建线程还是使用ThreadPool的好情况?我希望这项任务是低优先级,并且可以使用最少的资源,因为即使电子邮件迟到了1小时,我也不介意。
感谢你的帮助
马克
解决方案
这是另一个建议...如果您使用DB,请与需要发送和使用的消息相关的任务(即创建一个代表要完成的任务的表) Quartz.net 或类似的(您也可以创建Windows服务),以寻找不完整的任务并执行它们(如果成功执行执行,则将其标记为完成)。
其他提示
坦白说,在ASP.NET中穿线不是一个好主意。当请求结束并向用户发布时,ASP.NET会进行大量资源处置。由于您不希望用户等待,因此您会遇到这种情况,在这种情况下,您认为安全使用的ASP.NET对象确实被处置了。
您的最佳选择是创建外部服务(在IIS中运行的WCF服务,或具有WCF接口的Windows服务),.NET页面可以异步调用,并运行该请求直到完成为止。不用担心线程等。它在自己的过程中运行,完成后完成。由于您不在乎告诉用户完成的用户,因此您不必担心它会返回。这样,如果您需要其他页面使用相同的服务界面,则可以在那里调用。
WCF入门的页面:
http://bloggingabout.net/blogs/dennis/archive/2007/04/20/wcf-simple-example.aspx
http://msdn.microsoft.com/en-us/library/bb332338.aspx
http://www.c-sharpcorner.com/articles/articlelisting.aspx?sectionId = 1&subsectionId=192
因此,我的建议是使用ThreadPool。它可以让您排队所有的一切,以分别运行它们,从而使其使用较少的资源,但是当然,花更长的时间来处理所有内容,但是就像您说的那样,时间不是问题。
您可以使用任务来产生工作线程以处理电子邮件。
如果这对CPU进行了太多的锤击,则可以创建一个新的调度程序,以减少并发: http://msdn.microsoft.com/en-us/library/ee789351.aspx
static void StartMailTasks(string[] addresses)
{
List<Task> tasks = new List<Task>();
foreach (var address in addresses)
{
tasks.Add(Task.Factory.StartNew(Email, address));
}
Task.Factory.ContinueWhenAll(tasks.ToArray(), AllDone, TaskContinuationOptions.OnlyOnRanToCompletion);
Task.Factory.ContinueWhenAny(tasks.ToArray(), ReportError, TaskContinuationOptions.OnlyOnFaulted);
}
static void AllDone(Task[] tasks)
{
// All is well
}
static void ReportError(Task errorTask)
{
// Log or report the error
}
static void Email(object state )
{
// send the e-mail
// Can throw error, if needed
}