Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该有一个休眠线程,然后调用一个方法吗?_C#_.net - Fatal编程技术网

C# 我应该有一个休眠线程,然后调用一个方法吗?

C# 我应该有一个休眠线程,然后调用一个方法吗?,c#,.net,C#,.net,我想知道这是否有效。我有一个简单的C#cmd行应用程序。它在设定的时间(通过windows调度程序)发送电子邮件 我想知道smtp是否会说失败这是个好主意吗 在smtpException中,我放置了休眠15分钟的线程。当它醒来时,它只是再次调用该方法。这一次,希望smtp能够备份。如果没有,它将继续这样做,直到smpt重新联机 我在这件事上遗漏了什么不好的方面吗?当然,我会做一些日志记录来说明这一点。这不是一个坏主意,事实上,您正在有效地实现的是 该模式背后的想法是,如果外部资源关闭,它可能不会

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

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

在smtpException中,我放置了休眠15分钟的线程。当它醒来时,它只是再次调用该方法。这一次,希望smtp能够备份。如果没有,它将继续这样做,直到smpt重新联机


我在这件事上遗漏了什么不好的方面吗?当然,我会做一些日志记录来说明这一点。

这不是一个坏主意,事实上,您正在有效地实现的是

该模式背后的想法是,如果外部资源关闭,它可能不会在几毫秒后恢复。可能需要一些时间来恢复。通常,断路器模式被用作快速故障的手段,以便用户能够更快地获得错误;或者为了不在故障系统上消耗更多资源。当您有可以放入队列的东西,并且不需要像您一样立即交付时,等待资源再次可用是完全合理的


但是需要注意的是:在完全失败之前,您可能希望有最大的重试次数,并且您可能希望在开始时延迟不到15分钟。

无限循环总是令人担忧的。您应该设置它,使其在N次尝试后失败,并且您肯定应该有办法从用户控制台将其关闭


当失败不是你的时候,失败也不是一件坏事。让它失败并报告失败的原因。

您的选择是有限的。假设这只是一个暂时的条件,并且它在某个点上起了作用。您唯一能做的就是通知问题,请某人修复它,然后稍后重试该操作。您需要做的唯一一件事就是保护消息,这样您就不会丢失任何消息。

如果您坚持使用您得到的并发性监视,那么可能需要一个命名的互斥锁,以确保一次只运行一个进程


我以类似的方式向我们所有的开发人员发送通知。仅在数据库中存储消息正文和主题。成功处理消息后,我在数据库中设置了一个成功标志。这种方式很容易跟踪和报告错误,而重试是一件轻而易举的事

我认为指数退避是这里常见的选择。与TCP尝试建立连接时使用的策略类似:每次尝试失败时超时加倍。防止您的程序在有人注意到某个错误之前用重复的失败通知淹没事件日志。这可能需要一段时间


但是,使用任务调度器肯定没有帮助。你真的应该重新编程,这样你的程序就不会不必要地消耗机器资源。但是从.NET使用ITaskService接口并不是那么容易。退房。

我强烈建议使用Windows服务。长时间运行的进程在后台运行,等待很长时间,并且需要一个受控的、记录的、“可监视的”生命周期:Windows服务就是这样做的

Thread.Sleep
可以完成这项工作,但是如果您希望它可以从另一个线程或其他正在发生的事情中断,我建议您使用
Monitor.Wait
()。然后,您可以在服务创建和管理的线程中运行您的进程,如果需要停止/中断,您可以在同一同步对象上监视.Pulse,线程将恢复正常

另请参考:


希望有帮助

断路器模式用于停止外部服务过载。他在这里所说的是“如果它不起作用,请稍后再试,因为某种外力可能已经固定了某种模式”-1@Romain“外力”可能已经解决了这个问题。该部队是一名网络技术人员,或者可能是SMTP因为过载而实际上停机。我同意它不应该是一个无限循环,而是在以后某个时间点重试事务。我只是讨厌人们到处提出模式,并试图在每一行代码中展示它们。用计数器重置所需的内容编辑您的答案。是的,我正在考虑计数器。我将如何实现一个?你如何从控制台关闭它我想他们会终止控制台。计数器会很好,你可以把睡眠/调用对放在一个循环中,如果超过计数,就退出。您还可以每次延长等待时间(指数退避),因为如果在前5分钟内等待时间没有“固定”,那么在接下来的5分钟内等待时间可能不会固定。例如,这在以太网网络冲突检测和重发中很常见。为了支持关闭长时间等待的线程,在循环中添加一些代码来检查控制台输入,或者检查一个全局布尔标志,该标志表示“忘记它,回家”设置主线程中的标志以响应用户输入。我不会获得睡眠/调用对,就像我再次调用该方法时,它不会再出现在4循环中吗?伪代码:函数mysend(){for(int count=4;count>0;count--){try{send(msg);break;}catch{logit();sleep(n);}