我想知道这会有用吗。我有一个简单的C#cmd行应用程序。它会在设定的时间发送电子邮件(通过Windows调度程序)。
我想知道smtp是否会说失败会是一个好主意吗?
在smtpException中我把线程睡了15分钟。当它醒来时,它再次调用该方法。这一次希望smtp能够恢复。如果没有,它将一直这样做,直到该smpt重新上线。
我缺少一些关于此事的缺点吗?我当然会记录这种情况。
答案 0 :(得分:1)
这不是一个坏主意,事实上你有效实施的是Circuit-Breaker pattern的简单变体。
该模式背后的想法是,如果外部资源出现故障,它可能不会在几毫秒之后恢复。可能需要一些时间来恢复。通常,断路器模式用作快速失败的手段 - 以便用户可以更快地获得错误;或者为了不在故障系统上消耗更多资源。当你有可以放入队列的东西,并且不像你那样需要即时交付时,等待资源再次可用是完全合理的。
有些注意事项:您可能希望在完全失败之前有最大重试次数,并且您可能希望以不到15分钟的延迟开始。
答案 1 :(得分:1)
我认为指数回退是我们常见的选择。与TCP用于尝试建立连接的策略类似:每次失败尝试的超时时间加倍。在有人注意到出错之前,防止您的程序在重复失败通知的情况下充斥事件日志。这可能需要一段时间。
但是,使用任务调度程序肯定没有帮助。你真的应该重新编程它,这样你的程序就不会不必要地耗费机器资源。但是使用.NET的ITaskService接口并不容易。查看this project。
答案 2 :(得分:0)
无限循环总是令人担忧。您应该将其设置为在N次尝试后失败,并且您肯定应该有一些方法可以将其从用户控制台关闭。
当失败不属于你时,失败并不是一件坏事。让它失败并报告失败的原因。
答案 3 :(得分:0)
您的选择有限。假设它只是一个临时条件而且它在某个时刻起作用了。您唯一能做的就是通知问题,让某人修复它,然后再重试操作。您唯一需要做的就是保护邮件,这样您就不会丢失任何邮件。
答案 4 :(得分:0)
如果你坚持使用你要注意的并发性,可能是一个命名的互斥锁,以确保一次只运行一个进程。
我以类似的方式向所有开发者发送通知。只是,我将邮件正文和主题存储在数据库中。消息成功处理后,我在数据库中设置了成功标志。通过这种方式,它易于跟踪和报告错误和重试是一个很小的步骤。
答案 5 :(得分:0)
我强烈建议您使用Windows服务。长时间运行的进程在后台运行,等待很长一段时间,需要一个受控的,记录的,“可监视的”生命周期:这就是Windows服务所做的。
Thread.Sleep
可以完成这项工作,但是如果您希望它可以从其他线程或其他内容中断,我建议Monitor.Wait
(MSDN ref)。然后,您可以在由服务创建和管理的线程中运行您的进程,如果您需要停止/中断,则Monitor.Pulse
在同一个同步对象上,线程将恢复生命。
同样参考:
希望有所帮助!