![](/img/trans.png)
[英]C# Best way to schedule recurring task in an efficient windows service
[英]Best way to schedule messages to be sent using a Windows service in C#
我将尝试简要解释我想要实现的目标。 我最初的想法是这样做的,在我看来不会很好,所以我正在努力决定如何最好地计划这个。
第一个想法是:
我有一个需要在预定时间发送的消息列表,每个消息都存储在中央 SQL 数据库中。
目的是使用 Windows 服务,该服务将有一个每 30 分钟计时一次的计时器。 所以..
30 Mins pass > Call ScheduleMessages()
ScheduleMessages 将在接下来的 30 分钟内检查数据库中是否有任何需要 go 发出的未发送消息,然后在数据库中将它们标记为:
ScheduleActivated = 1
对于它标记为 ScheduleActivated = 1 的每一个,它将触发一个客户时间 object,它继承自普通计时器,其中还包括它需要发送的消息的属性。
将设置为在消息是由于 go 发出时打勾,将发送消息并在数据库中标记为成功。
这样做的主要问题是我将在所有地方都有计时器,如果一次有几百条消息被丢弃,它可能要么表现不佳,要么完全崩溃。
重新评估后,我想到了解决方案2
我的另一个想法是在服务中运行 1 个计时器,每 10 分钟计时一次。 每次它滴答作响时,它都会触发一个方法,该方法将在该时间之前的任何时间发送的每条消息收集到一个列表中,然后一次处理一个。
这似乎占用的资源要少得多,但我担心如果计时器在 10 分钟后滴答作响,任何尚未完成发送的消息都会在下一个滴答声中被捕获,并再次发送。
计时器运行 10 分钟后停止计时器是否可行,然后在发送消息后重置为零并重新启动。
是否有比上述更好的问题的第三种解决方案?
我们在一个项目中实现了这一点,对我们有用的是:
标记消息可避免重新发送,如果要重新发送,只需将日期设置为 null。
我们遇到的唯一问题是服务作为单线程运行,因此发送的消息数量受到限制。 但是在这成为问题之前,您会收到很多消息和非常小的 window。
抛弃固定间隔。 Windows 有很多方法可以在特定时间内休眠,包括休眠 function、可等待定时器等。
其中一些在 .NET 中可用,例如WaitHandle.WaitAll
接受睡眠时间和事件,这样您的线程可以等到下一个计划项目,但也可以被修改计划的请求唤醒。
在我看来,调度服务应该只负责检查调度,任何工作都应该交给一个单独的服务。 调度服务不应该关心要调度的工作。 尝试实现一个包含执行方法的工作项接口。 这样,执行 object 就可以自己处理内部,而无需了解调度服务。 对于日程安排,您是否查看了quartz.net?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.