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

时间:2009-03-30 02:55:42

标签: console-application keep-alive

我即将开发一个控制台应用程序,需要在特定时间连续运行和执行工作。

我的问题是保持应用程序存活的最佳方法或实践是什么?

我的想法是:   一个永无止境的循环?   一个计时器,在需要时(在设定的睡眠期后)睡觉,然后跳到常规?

我将把应用程序编译成exe,然后使用AlwaysUp将其作为服务运行。

此致..

彼得

11 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:8)

为什么不首先将您的应用程序构建为服务?

答案 2 :(得分:4)

虽然您真的应该使用服务,但如果您需要/想要这样做,您可以使用ManualResetEvent来执行此操作:

private ManualResetEvent Wait = new ManualResetEvent(false);

当你完成“开始”并想等待时,你就会这样做:

Wait.WaitOne();

当你想停下来让它退出时,你可以这样做:

Wait.Set();

答案 3 :(得分:3)

你可能不想只是在循环中旋转而不必要地消耗处理器时间。

假设你在Windows上,你应该有一个循环,永远不会以调用WaitForSingleObject()或WaitForMultipleObjects()或MsgWaitForMultipleObjects()结束,具体取决于你的需要。然后有一些唤醒你的同步对象,例如命名事件。

请参阅Win32同步文档here。如果您详细说明您的计划需要做什么,我们可能会提供更具体的建议。

答案 4 :(得分:3)

您可以添加对System.Windows.Forms的引用并调用System.Windows.Forms.Application.Run()以开始标准应用程序消息循环。 Ctrl-C 将终止该应用。

另一种选择是使用Console.ReadKey()暂停应用。与Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

一样

当我们坐在那里等待事件发生时,这就是我在我的控制台应用程序中使用的内容。在任何一种情况下,应用程序都将继续运行并捕获触发的事件(例如来自计时器,WCF,FileWatcher等)。

答案 5 :(得分:2)

持续运行的代码称为守护程序,并且有一篇文章 here概述了如何做你要求的事情。这将指出一个如何编写简单服务here的示例。

答案 6 :(得分:2)

如果你的程序将继续运行,那么你应该睡觉直到发生所需的事件(例如XX秒过去)。如果你只是旋转一段时间{}循环,你就会吸收CPU时间。

如果您的程序将始终在计算机上运行,​​那么您应该考虑将其作为服务,以便它自动启动和停止在计算机上。

答案 7 :(得分:1)

嗯,我确定它应该停止,不是吗?

生成一个可行的线程,并且如果您希望它也可以作为控制台应用程序运行,则在Console.ReadLine()上具有主线程块。

如果你真的想永远暂停主线程,只需阻止你永远不会触发的ManualResetEvent。

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

答案 8 :(得分:1)

如果您构建桌面应用程序,则需要在系统托盘中运行它。这将

  1. 防止用户意外关闭应用程序
  2. 让您的应用程序不会弄乱用户的屏幕
  3. 如果构建服务器应用程序,则需要编写Windows服务。这将

    1. 让管理员不小心关闭您的应用程序
    2. 消除服务器让某人登录控制台以使您的应用程序在
    3. 中运行的需要

      作为主要是IT专业人士的人,我会说我们得到的第三方应用程序作为控制台应用而不是Windows服务运行,我们付出了很多努力来避免购买。它为我们创造了很多工作,并且开辟了重要的支持问题和安全漏洞。

答案 9 :(得分:1)

发送线程进入睡眠状态:  System.Threading.Thread.Sleep(10000);

等待按键被按下:  Console.WriteLine(“按任意键继续...”);  Console.Read();

答案 10 :(得分:0)

创建一个任务,然后等待它。

class Program
{
    static void Main(string[] args)
    {
        var processTask = Process();
        processTask.Wait();
    }

    private static async Task Process()
    {
        var isNotCancelled = true;

        while (isNotCancelled)
        {
            //Polling time here
            await Task.Delay(1000);

            //TODO: Do work here and listen for cancel
            Console.WriteLine("I did  some work...");
        }
    }
}