2012-08-15 99 views
1

我有一个应该运行24 * 7 * 365的C#4.0 Windows控制台应用程序。 (我有一个Windows服务来监视这个应用程序,并且如果它由于某种原因而终止,就启动它)。此控制台应用程序的启动涉及一些复杂的资源消耗活动 - 所以我必须确保不会频繁重新启动控制台应用程序。控制台应用程序有3个System.Timers.Timer实例,它们在计时器过去时执行一些活动(时间间隔分别为10秒,15秒和2小时)。什么才是正确的方法来防止控制台应用程序终止,并保持活着?有人可以请建议!防止终止控制台应用程序

+0

你现在还活着吗?当然你有一个循环? 'while(true)Console.ReadKey()'是否足够? – 2012-08-15 07:40:42

+1

你需要说明是什么导致它在第一个地方终止 – 2012-08-15 07:40:54

+9

我不得不问:你*真*有一个*服务*来监视和启动*永远在运行的控制台* ...?你为什么不把代码**移入服务**(因为你描述的是服务的行为) – 2012-08-15 07:42:23

回答

2

从你已经在你的意见,你有一个控制台应用程序的唯一理由说所以你可以阅读调试信息。这个答案将离开这个假设。

控制台应用程序不够可靠,无法做你想做的事情,有很多情况下你会遇到应用程序不会启动或可能启动多次(如果没有人登录,你会怎么做?如果多人登录,你会怎么做?)

要做的最好的事情就是把这个密集型操作写成服务,然后把输出到控制台的任何诊断信息都输入到事件日志中或者把它放到调试器中。

如果你想写一条消息到应用程序事件日志,你所需要做的就是将你的信息写入this.EventLog.WriteEntry(message)。这将在应用程序事件日志中为您的服务生成一个信息事件。如果您想将严重程度提高到警告或错误,则只需使用the other overload即可。

如果你想写入与应用程序不同的日志(比如你自己的日志),你将需要服务的installer创建你需要的任何源/日志(如果你需要帮助,请提出一个新问题) 。然后在您的服务中将AutoLog设置为false,然后创建自己的指向新日志的事件日志实例。

如果您想要在诊断问题时才显示的日志,最简单的解决方案是将您的Console.WriteLine(message)语句更改为Debugger.Log(1, "DebugLogging", message + Environment.NewLine)。这会导致您的消息在运行时连接到服务时显示在“调试”输出窗口中(您知道如何连接到服务以在其上运行调试器吗?如果没有问一个新问题它)。我不会推荐使用Debug.WriteLine(message),除非您在发布模式下构建时从不打算进行诊断。这是因为Debug.WriteLine具有属性[Conditional("DEBUG")]。这是因为只有在编译期间DEBUG标志被设置时,该函数才会被执行,并且Release没有设置该标志。


如果你想有一个更强大的解决方案,我建议学习如何使用log4net这是简单的解决方案。 Log4net可以让你完成以上所有工作,还有更多。例如,您可以控制通过配置文件写入事件日志的多少(程序甚至不需要重新启动以使用新设置开始记录,它会检测您何时执行保存。)

这样您可以将详细日志消息放入代码中,但只需通过更改XML配置文件中的一个设置即可在需要时将其打开。

如果您对设置两个顶级建议中的任何一个或设置log4net有任何疑问,请随时就这些主题提出新问题。

+0

谢谢,我已经在使用Log4Net了。现在我已经将这个完整的功能作为服务来实现。 – Thomas 2012-08-16 02:11:44

1

您可以简单地使用Console.ReadLine()使控制台保持活动状态。但Windows服务可能是你想要的。

1

while (Console.ReadLine() != "I really want to stop this application") { }或类似的东西?

的类似应用思维(如我的世界......),你就会有一个循环,如以下几点:

string command; 
Console.Write("> "); 
while ((command = Console.ReadLine()).ToUpper() != "STOP") 
{ 
    // Do something else based on the command 
    ... 

    Console.Write("> "); 
} 
+0

由于控制台应用程序是从Windows服务中触发的,因此我不会看到控制台应用程序停止它 - 这意味着基本上没有桌面交互。 – Thomas 2012-08-15 07:51:30

+0

在这种情况下,我必须使用“运行服务中的代码”。 – Rawling 2012-08-15 08:02:21