C#控制台应用程序 - 如何保持其运行

13
我即将开发一个控制台应用程序,它需要在特定时间不断运行并执行任务。我的问题是,保持应用程序处于活动状态的最佳方法或做法是什么?我的想法是:一个永远不会结束的循环?一个定时器睡眠,然后在需要时跳转到例程(在设定的睡眠期之后)?我将把应用程序编译为exe文件,然后使用AlwaysUp作为服务运行。敬礼。 彼得

你得到这么多不同类型的回复的原因是因为你没有提供关于这个东西将要做什么的很多信息。有了更多的信息,你就能够缩小目前所提供选项的范围。 - Cheeso
11个回答

14
一个更好的解决方案是编写一个控制台应用程序来完成它的工作并退出。然后您可以使用Windows任务计划程序定期运行它。

2
完全同意!Jon Galloway在一段时间前写了一篇博客文章,让我相信我做错了,应该制作一个任务而不是服务:http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx - Neil Williams
我认为服务在用户凭据方面提供更多的灵活性。 - ojblass
就我所见,您至少可以设置计划任务将在哪些凭据下运行。您可以使用服务做什么,但无法使用任务做什么? - Neil Williams
底线是,我们不知道因为OP没有告诉我们他实际想做什么。 - i_am_jorf

8
为什么不一开始就将你的应用程序构建为服务?

5

虽然你真的应该使用服务来完成这个任务,但如果你需要或想要自己完成,你可以使用ManualResetEvent来实现:

private ManualResetEvent Wait = new ManualResetEvent(false);

当您完成“启动”并希望只等待时,您需要执行以下操作:

Wait.WaitOne();

当您想停止并退出时,可以执行以下操作:

Wait.Set();

3
您可以添加对 System.Windows.Forms 的引用,并调用 System.Windows.Forms.Application.Run() 来开始一个标准的应用程序消息循环。按下 Ctrl-C 将终止应用程序。
另一个选择是使用 Console.ReadKey() 暂停应用程序。例如: Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey(); 当控制台应用程序只是等待事件发生时,我会在我的控制台应用程序中使用这种方法。无论哪种情况,应用程序都将继续运行并捕获触发的事件(例如来自计时器、WCF、FileWatcher 等)。

3
您可能不希望无意义地循环,浪费处理器时间。假设您使用的是Windows系统,您应该有一个永不结束的循环,并调用WaitForSingleObject()、WaitForMultipleObjects()或MsgWaitForMultipleObjects(),具体取决于您的需求。然后,有一些同步对象会唤醒您,例如命名事件。请参见Win32同步文档here。如果您进一步阐述程序需要做什么,我们可以提供更具体的建议。

嗨, 感谢更新,我选择将其作为一个控制台应用程序的原因是这样我就可以随时手动运行它。该应用程序将读取一个配置文件,并根据配置文件中存储的信息,在指定时间执行文件读取/处理操作。 - undefined
如果特定目录中缺少文件,还需要发送警报电子邮件。如果该文件存在,则需要打开并读取以查找错误,任何错误都需要发送警报电子邮件。 - undefined

2

持续运行的代码称为"守护进程",有一篇文章在这里介绍了如何做到你所要求的。那将指向一个编写简单服务的示例在这里


是的,我考虑过使用服务,但我认为它不能满足我的需求,因为我需要处理文件并从存储的文件中读取配置信息,以便在配置文件中指定的特定时间执行工作。 - undefined

2
如果您的程序需要持续运行,那么应该在期望事件发生前休眠一段时间(例如,等待 XX 秒)。如果您只是在 while {} 循环中不停运行,则会消耗 CPU 时间。
如果您的程序需要一直在计算机上运行,则应考虑将其作为服务来运行,这样它就可以随着计算机的启动和关闭而自动启动和停止。

1

我相信在某个时候它应该停止,不是吗?

如果你想让它作为控制台应用程序运行,可以生成一个执行工作的线程,并使主线程阻塞在Console.ReadLine()上。

如果你真的只想永远暂停主线程,那就在一个你从未触发的ManualResetEvent上阻塞。

但是,如果可以的话,请考虑使用服务。


1
如果您正在构建桌面应用程序,您将希望它在系统托盘中运行。这将:
  1. 防止用户意外关闭应用程序
  2. 避免应用程序在用户屏幕上产生混乱
如果您正在构建服务器应用程序,您将希望编写一个Windows服务。这将:
  1. 防止管理员意外关闭您的应用程序
  2. 消除服务器需要有人登录控制台才能运行您的应用程序的需求
作为一名主要从事IT专业工作的人,我会说,我们得到的第三方应用程序如果以控制台应用程序而不是Windows服务运行,我们会花费很多精力来防止其被购买。这会给我们带来很多工作,并开启重大的支持问题和安全漏洞。

1
让线程休眠: System.Threading.Thread.Sleep(10000);
等待按键被按下: Console.WriteLine("按任意键继续..."); Console.Read();

线程休眠会使软件变得更慢,不应该使用。对于控制台应用程序,您应该使用AutoResetSignal,或者如果需要一直运行,则可以创建一个服务。 - Piotr Kula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接