安排使用C#中的Windows服务发送邮件的最佳方式
本文关键字:方式 最佳 服务 Windows 中的 | 更新日期: 2023-09-27 18:01:12
我将尝试简要解释我想要实现的目标。在我看来,我最初的想法不会奏效,所以我正在努力决定如何最好地计划。
最初的想法是:
我有一个需要在预定时间发送的消息列表,每个消息都存储在一个中央SQL数据库中。
其目的是使用Windows服务,该服务将具有每30分钟一次的计时器。所以…
30 Mins pass > Call ScheduleMessages()
ScheduleMessages将检查数据库中是否有任何未发送的消息需要在接下来的30分钟内发出,然后在数据库中标记为:
ScheduleActivated = 1
对于每一个它标记为ScheduleActivated=1的计时器,它都会触发一个从普通计时器继承的客户时间对象,该对象还包括它需要发送的消息的属性。
它将被设置为在消息发出时打勾,将发送消息并在数据库中标记为成功。
这方面的主要问题是,我会到处都是计时器,如果一次发送几百条消息,它可能会表现不佳,或者完全崩溃。
重新评估后,我想到了解决方案2
我的另一个想法是在服务中运行一个计时器,每10分钟一次。每次勾选时,它都会启动一个方法,将在此之前的任何时候发送的每一条消息收集到一个列表中,然后一次处理一条。
这似乎不那么耗费资源,但我担心,如果计时器在10分钟后滴答作响,任何尚未完成发送的消息都会在下一次滴答声中被捕获,然后再次发送。
计时器运行10分钟后停止,然后重置为零,并在发送消息后重新启动,这是否可行。
这个问题有没有第三种解决方案比上面的更好?
我们在一个项目中实现了这一点,对我们有效的是:
- 所有写入表并带有发送时间的消息
- 每x分钟检查一次是否有要发送的内容的服务
- 当服务发送消息时,它还将消息标记为已发送(将发送时间从null更新为实际发送时间(
标记邮件可以避免重新发送,如果您想重新发送,只需将日期设置为空即可。
我们遇到的唯一问题是,服务作为单个线程运行,因此发送的消息数量有限。但在这成为问题之前,你会有很多信息和一个很小的窗口。
放弃固定间隔。Windows有很多方法可以在特定的时间内睡眠,包括睡眠功能、可等待计时器等。
其中一些在.NET中可用,例如WaitHandle.WaitAll
接受睡眠时间和事件,这样线程可以等到下一个计划项目,但也会被修改计划的请求唤醒。
在我看来,调度服务应该只负责检查时间表,任何工作都应该交给一个单独的服务。调度服务不应该关心要调度的工作。尝试实现一个包含execute方法的工作项接口。这样,执行对象就可以自己处理内部,而不需要知道调度服务。关于日程安排,你查看过quartz.net吗?