安排使用C#中的Windows服务发送消息的最佳方法

时间:2011-07-02 12:24:03

标签: c# .net scheduling messaging instant-messaging

我会试着简要解释一下我想要实现的目标。我这样做的初步想法在我看来不会很好,所以我想决定如何最好地计划这个。

首先想到的是:

我有一个需要在预定时间发送的消息列表,每个消息都存储在一个中央SQL数据库中。

目的是使用一个Windows服务,该服务的计时器每30分钟打一次。所以..

30 Mins pass > Call ScheduleMessages()

ScheduleMessages将检查数据库中是否存在需要在接下来的30分钟内发出的任何未发送的消息,然后它将在数据库中标记为:

ScheduleActivated = 1

对于每一个它标记为ScheduleActivated = 1,它将触发一个客户时间对象,该对象继承自普通计时器,该计时器还包括它需要发送的消息的属性。

将在消息发出时设置为勾选,将发送消息并在数据库中标记为成功。

这个问题的主要问题是我将在整个地方安排计时器,如果一次有几百条消息,那么可能要么表现不佳,要么完全失败。

重新评估后,我想到了解决方案2

我的另一个想法是在服务中运行1个计时器,每10分钟计时一次。每次勾选时,它都会触发一个方法,该方法收集每一条消息,直到该时间为止,直到该列表为止,然后一次处理一个消息。

这看起来资源密集程度要低得多,但我担心如果计时器在10分钟后嘀嗒,任何尚未完成发送的消息都会在下一个时间段内被捕获,然后再次发送。

计时器一旦运行10分钟就停止计时,然后重置为零,并在邮件发送后再次启动。

问题的第三个解决方案是否优于上述解决方案?

3 个答案:

答案 0 :(得分:2)

我们在一个项目上实现了这一点,对我们有用的是:

  • 使用发送时间写入表格的所有消息
  • 每隔x分钟检查是否有发送内容的服务
  • 当服务发送消息时,它还会将消息标记为已发送(更新发送时间从空到实际发送时间)

标记邮件可避免重新发送,如果您想重新发送,则只需将日期设置为空。

我们遇到的唯一问题是服务作为单个线程运行,因此发送的消息数量有限。但在这是一个问题之前,你会收到很多消息和一个非常小的窗口。

答案 1 :(得分:1)

抛弃固定间隔。 Windows有很多方法可以在特定的时间内睡眠,包括睡眠功能,等待定时器等。

其中一些在.NET中可用,例如WaitHandle.WaitAll接受休眠时间和事件,这样您的线程可以等到下一个计划项目,但也会被修改计划的请求唤醒。

答案 2 :(得分:0)

在我看来,调度服务应该只负责检查时间表,任何工作都应该传递给单独的服务。调度服务不应该关心要安排的工作。尝试实现包含execute方法的工作项接口。这样,执行对象可以自己处理内部,并且不需要知道调度服务。对于调度你有没有检查过quartz.net?