C# - 如何为程序创建“保护进程”并确保它始终运行?

Posted

技术标签:

【中文标题】C# - 如何为程序创建“保护进程”并确保它始终运行?【英文标题】:C# - How to create a "guarding process" for a program and make sure it is always running? 【发布时间】:2020-08-19 21:44:35 【问题描述】:

我创建了一个程序,它从数据库中读取任务(发送电子邮件/发送短信等)并在应有的特定时间执行每个任务。该程序工作并执行所有任务。我正在使用错误处理,但我想采取额外的预防措施,因此如果程序因任何原因崩溃,它会通知我并自动重新启动程序并执行因崩溃而未执行的任务。 程序在windows上运行。

编辑: 我将详细解释该程序的工作原理。 该程序不断地从 sql 表中读取,并向一个回答此参数的列表添加提醒: IsExecuted=False 并且 DateTimeStart 距离 DateTime.Now 1 分钟范围内。 一旦我读完表格并将相关提醒添加到列表中。 我执行所有提醒(异步)-> 从列表中删除它们-> 并在 sql 表中更改 IsExecuted=True 以便它不会再次添加它。 发送完所有提醒后,我会无限重复此过程。

实现这一目标的最佳方法是什么?如何创建一个服务/程序,不仅重新启动主程序,还检查哪些提醒应该执行但没有执行?

谢谢。

【问题讨论】:

您可以使用windows任务调度程序,放置一个任务来检查您的进程是否正在运行,如果没有重新开始,您可以在用户接受安装您的应用程序的那一刻进行此配置(具有特权用户,使用 msi),用于生成 msi 安装程序,我推荐 wixtoolset (wixtoolset.org) 您能告诉我们更多细节吗?你想对那些处理失败的“任务”做什么?您想再次尝试处理它们吗?还是要将它们放入死信队列?您是否考虑过使用 Windows 服务?或者您正在寻找一些自托管解决方案?我们是在谈论 .NET Framework 还是 .NET Core?等等...请给我们更多的细节,以便为您提供帮助。 @PeterCsala 嗨,彼得,谢谢。我编辑了这个问题,所以我会更清楚程序是如何工作的。 【参考方案1】:

您可以install your program as a service。然后,您可以手动或by powershell 配置恢复选项。

如果需要,您可以将监控程序安装为服务,并让它运行主程序。但是,如果主程序中的故障不会导致某些无法恢复的不一致状态,我认为没有必要这样做。

【讨论】:

【参考方案2】:

“自托管”控制台应用程序最简单的方法可能是将其包装到 Windows 服务 中。服务崩溃时可以自动重启。您应该查看SO discussion 以了解更多详情。


还有另一件事,应该考虑。据我了解,您的应用程序工作流程可以这样描述: 1) 读取未处理的数据 2/A) 处理读取数据 2/B) 将数据标记为已处理

我使用 A 和 B 表示它们是同时执行。但这有一个问题,2/A 或 2/B 发生的事情都失败了。

如果 2/A 失败但 2/B 成功则作业失败,但报告成功(不会启动重试) 如果 2/B 失败但 2/A 成功,则作业已完成,但未报告为成功(因此将重试)

更好的方法是通过引入ProcessStartedProcessFinished 状态来使用语义锁定。考虑到这一点,工作流程将如下所示:

1) 读取未处理的数据并将其标记为ProcessStarted 2) 过程数据 3) 将处理后的数据标记为ProcessFinished

使用这种方法,您可以通过查询状态为 ProcessStarted 且上次修改日期大于预定义阈值的数据,轻松确定哪些数据已开始处理但未能完成。

还有一点需要注意,在批处理的情况下,您应该能够重试整个批处理,而不仅仅是单个数据。

【讨论】:

以上是关于C# - 如何为程序创建“保护进程”并确保它始终运行?的主要内容,如果未能解决你的问题,请参考以下文章

应用程序启动后,如何为用户订阅主题以获取通知?

如何为我的 C# 应用程序创建产品密钥?

如何为 APN 标记化(.NET、C#)编码 JWT

C# 如何为 Windows 服务创建安装项目以自动安装它?

如何为测试目的模拟网络故障(在 C# 中)?

如何为 SonarQube 创建自己的 C# 自定义规则?