我应该有一个睡眠的线程然后调用方法吗?

时间:2010-07-15 18:17:31

标签: c# .net

我想知道这会有用吗。我有一个简单的C#cmd行应用程序。它会在设定的时间发送电子邮件(通过Windows调度程序)。

我想知道smtp是否会说失败会是一个好主意吗?

在smtpException中我把线程睡了15分钟。当它醒来时,它再次调用该方法。这一次希望smtp能够恢复。如果没有,它将一直这样做,直到该smpt重新上线。

我缺少一些关于此事的缺点吗?我当然会记录这种情况。

6 个答案:

答案 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.WaitMSDN ref)。然后,您可以在由服务创建和管理的线程中运行您的进程,如果您需要停止/中断,则Monitor.Pulse在同一个同步对象上,线程将恢复生命。

同样参考:

  

Best architecture for a 30 + hour query

希望有所帮助!

相关问题