我有一个C#4.0 Windows控制台应用程序,应该运行24 * 7 * 365。 (我有一个Windows服务来监视这个应用程序,如果由于某种原因终止它,就启动它)。此控制台应用程序的启动涉及一些复杂的资源消耗活动 - 因此我必须确保不会频繁重新启动控制台应用程序。控制台应用程序有3个System.Timers.Timer实例,它们在计时器结束时执行一些活动(间隔为10秒,15秒和2小时)。什么是防止控制台应用程序终止并保持活动的正确方法?请有人建议!
答案 0 :(得分:2)
根据您在评论中所说的,您拥有控制台应用程序的唯一原因是您可以阅读调试消息。这个答案将取消这个假设。
控制台应用程序不够可靠,无法执行您想要执行的操作,您会遇到许多情况,即应用程序无法启动或可能多次启动(如果没有人登录,您会怎么做?如果有多人登录,你会这样做吗?)
最好的办法是将此密集型操作作为服务编写,然后无论您输出到控制台的哪些诊断信息,都可以将其放入事件日志或将其放入调试器。
如果要将消息写入应用程序事件日志,您只需将信息写入this.EventLog.WriteEntry(message)
即可。这将在您的服务的应用程序事件日志中生成一个信息事件。如果要将严重性提高到警告或错误,则只需使用the other overload。
如果要写入与应用程序不同的日志(如您自己的日志),则需要让服务的installer创建您需要的任何源/日志(如果需要帮助,请提出新问题)有了这个)。然后将服务中的AutoLog
设置为false,然后创建指向新日志的事件日志实例。
如果您希望仅在诊断问题时显示的日志,最简单的解决方案是将Console.WriteLine(message)
语句更改为Debugger.Log(1, "DebugLogging", message + Environment.NewLine)
。这将导致您的消息显示在" Debug"在服务运行时附加到服务的输出窗口(你知道如何附加到服务上运行你的调试器吗?如果没有问一个新的问题)。除非您在内置发布模式时从未计划进行诊断,否则我不建议使用Debug.WriteLine(message)
。这是因为Debug.WriteLine
具有属性[Conditional("DEBUG")]
。这样做是因为如果在编译期间设置了DEBUG标志,则只执行该函数,并且Release没有设置该标志。
这是一个简单的解决方案,如果您想要一个更强大的解决方案,我建议您学习如何使用log4net。 Log4net将让您完成上述所有操作,还有更多功能。例如,您可以通过配置文件控制将多少内容写入事件日志(甚至不需要重新启动程序以使用新设置开始记录,它会在您执行保存时检测到。)
通过这种方式,您可以在代码中添加详细日志消息,但只有在需要时才能通过更改XML配置文件中的一个设置将其打开。
如果您对设置两个最重要的建议或设置log4net有任何疑问,请随时就这些主题提出新问题。
答案 1 :(得分:1)
您可以简单地使用Console.ReadLine()来使控制台保持活动状态。但Windows服务可能就是你想要的。
答案 2 :(得分:1)
while (Console.ReadLine() != "I really want to stop this application") { }
或类似的东西?
考虑类似的应用程序(例如Minecraft ......),您将拥有如下循环:
string command;
Console.Write("> ");
while ((command = Console.ReadLine()).ToUpper() != "STOP")
{
// Do something else based on the command
...
Console.Write("> ");
}