【问题标题】:C# Console Application - Keep it runningC# 控制台应用程序 - 保持运行
【发布时间】:2010-10-16 07:16:21
【问题描述】:

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

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

我的想法是: 一个永远不会结束的循环? 一个定时器,它会在需要时(在设定的睡眠期之后)休眠然后跳转到例行程序?

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

问候..

彼得

【问题讨论】:

  • 你收到这么多不同类型的回复的原因是你没有提供很多关于这个东西会做什么的信息。有了更多信息,您将能够缩小目前提供的一些选项。

标签: console-application keep-alive


【解决方案1】:

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

【讨论】:

  • 完全同意! Jon Galloway 不久前写了一篇博文,让我相信我做错了,因为我做的是服务而不是任务:weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx
  • 我认为服务在用户凭据方面提供了更大的灵活性。
  • 至少据我所知,您可以设置计划任务将在其下运行的凭据。你可以用一项服务来做什么,而你不能用一项任务来做?
  • 底线是我们不知道,因为 OP 没有告诉我们他实际上想做什么。
【解决方案2】:

为什么不首先将应用构建为服务?

【讨论】:

    【解决方案3】:

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

    private ManualResetEvent Wait = new ManualResetEvent(false);
    

    当您完成“开始”并只想等待时,您可以这样做:

    Wait.WaitOne();
    

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

    Wait.Set();
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 您好,感谢您的更新,我选择将其作为控制台应用程序执行此操作的原因是,它让我可以随时手动运行它。应用程序将读取配置文件并在给定时间从配置文件中存储的信息执行文件读取/处理。
      • 如果某个文件从某个特定目录中丢失,还需要发送一封警报电子邮件。如果文件存在,则需要打开并阅读以查找错误,任何错误都需要发送警报电子邮件。
      【解决方案5】:

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

      另一个选项是使用Console.ReadKey() 来暂停应用程序。赞Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

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

      【讨论】:

        【解决方案6】:

        持续运行的代码称为守护进程,有一篇文章 here 概述如何按照您的要求进行操作。这将为您提供一个如何编写简单服务here 的示例。

        【讨论】:

        • 是的,我认为这是一项服务,但认为它不能满足我的需求,因为我需要处理文件并从存储的文件中读取配置信息,以便在配置文件中指定的特定时间工作.
        【解决方案7】:

        如果您的程序要持续运行,那么您应该休眠直到所需的事件发生(例如 XX 秒过去)。如果你只是在一个 while {} 循环中旋转,你会占用 CPU 时间。

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

        【讨论】:

          【解决方案8】:

          好吧,我确定它应该在某个时候停止,不是吗?

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

          如果您真的只想永远暂停主线程,只需阻止您从未触发的 ManualResetEvent。

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

          【讨论】:

            【解决方案9】:

            如果您要构建一个桌面应用程序,您会希望它在系统托盘中运行。这将

            1. 防止用户意外关闭应用程序
            2. 避免您的应用程序弄乱用户的屏幕

            如果您构建一个服务器应用程序,您将需要编写一个 Windows 服务。这将

            1. 防止管理员意外关闭您的应用程序
            2. 不再需要服务器让某人登录控制台才能运行您的应用程序

            作为主要是 IT 专业人士的人,我想说的是,我们获得作为控制台应用程序而不是 Windows 服务运行的第 3 方应用程序,我们付出了很多努力来防止被购买。它为我们创造了大量工作,并带来了重大的支持问题和安全漏洞。

            【讨论】:

              【解决方案10】:

              发送一个线程休眠: System.Threading.Thread.Sleep(10000);

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

              【讨论】:

              • 线程休眠使软件分配变慢,不应使用。您应该将 AutoResetSignal 用于控制台应用程序,或者如果它需要一直运行,请提供服务。
              【解决方案11】:

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

              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...");
                      }
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 2010-11-17
                • 2011-02-04
                • 1970-01-01
                • 2023-03-03
                • 2018-02-09
                • 2018-06-18
                • 2013-06-10
                • 1970-01-01
                • 2011-01-22
                相关资源
                最近更新 更多