C# 在应用程序池中运行我的邮件队列是否错误?

C# 在应用程序池中运行我的邮件队列是否错误?,c#,asp.net,email,application-pool,smtpclient,C#,Asp.net,Email,Application Pool,Smtpclient,我们必须发送自动电子邮件。它们需要可靠地调度,因此我们将它们写入数据库。同时,在应用程序启动时启动的System.Threading.Timer每隔30秒调用一个方法读取数据库并发送,然后删除已发送的条目。所有这些都不会作为长期运行的任务发生。已注意确保清除db队列的过程使用异步方法,因此发送/队列的任何阶段都不会阻塞,整个过程都是通过线程池中的短期方法执行的。应用程序回收的成本也很低(可能导致重新发送一封电子邮件……这不是问题) 传统观点认为,在web应用程序中运行此功能不是一个好方法,我应该

我们必须发送自动电子邮件。它们需要可靠地调度,因此我们将它们写入数据库。同时,在
应用程序启动时启动的
System.Threading.Timer
每隔30秒调用一个方法读取数据库并发送,然后删除已发送的条目。所有这些都不会作为长期运行的任务发生。已注意确保清除db队列的过程使用异步方法,因此发送/队列的任何阶段都不会阻塞,整个过程都是通过
线程池中的短期方法执行的。应用程序回收的成本也很低(可能导致重新发送一封电子邮件……这不是问题)

传统观点认为,在web应用程序中运行此功能不是一个好方法,我应该将其转换为一项服务


写作服务是一个PITA。如果可能的话,我宁愿避免。那么为什么我不应该在我的应用程序池中运行一个高效的异步邮件队列呢?有人能告诉我吗?

如果您的站点未被使用,您的应用程序池将不会启动-不会发送邮件

写作服务是一个PITA

我想这是主观的。然而,你不认为把它投入服务会有好处吗?如果您想更改实现,根据我的经验,维护更小的单个组件要容易得多。当你把所有的东西都放在一个地方时,它通常会变得更像一个皮塔

您已经在将电子邮件写入数据库。编写一个简单的Windows服务非常简单,它只需扫描数据库并发送电子邮件。我知道这可能不太理想,但在某处和其他地方都有很多例子。您不必全神贯注地使用ESB(除非您愿意)


所以最终,你能做到并不意味着你应该做到。您必须权衡成本和收益。

您是否在数据库中指出某封电子邮件已被接收并正在发送?如果没有,您是否计划在多个web服务器上运行?如果上面的回答是“否”和“是”,那么你需要一种方法来防止两台服务器同时发送同一批电子邮件。@克丽珊,我知道这一点,如果网站发展到超出其服务器的程度,我会改变架构。保持计时器,我已经为我的程序做了一个类似的定时器工作,在过去的4年里工作得非常好-一点问题都没有,我甚至用一个线程和一个定时器做了一个需要2天工作的idexing。另请阅读:下一个可能的想法不是编写一个服务,而是编写一个简单的网络控制台程序,并计划它从windows调度器(运行控制台)运行。这是真的。我想知道在不活动后删除关闭应用程序池的超时有多糟糕?我们是唯一一个在这台机器上运行的应用程序。我想不出删除超时会有什么直接的问题。如果您的站点很少被使用,那么您需要担心由于不活动而重新启动,您需要考虑应用程序池关闭/重新启动时的其他情况(如重新启动),但您的站点不会自动启动。考虑一些外部的看门狗,它会周期性地ping ping站点,即使只是在站点上得到页面的本地调度任务也会发生。几乎不可能使用这个站点——谷歌几乎每秒都读取几乎所有的站点。@ AlexeiLevenkov当然不适合Intranet站点,应用程序什么时候启动,总是调用一个池循环,或者在编译之后。我从来没有见过一个案子不打电话的。