12

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

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

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

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

问候..

彼得

4

11 回答 11

14

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

于 2009-03-30T03:02:16.387 回答
8

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

于 2009-03-30T02:58:32.587 回答
5

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

private ManualResetEvent Wait = new ManualResetEvent(false);

当您完成“开始”并只想等待时,您将执行以下操作:

Wait.WaitOne();

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

Wait.Set();
于 2015-12-04T23:33:05.147 回答
3

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

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

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

于 2009-03-30T03:01:12.050 回答
3

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

另一种选择是用于Console.ReadKey()暂停应用程序。喜欢Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

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

于 2013-03-04T22:26:27.277 回答
2

持续运行的代码称为守护程序, 此处有一篇文章概述了如何执行您所要求的操作。这将为您提供一个如何在此处编写简单服务的示例。

于 2009-03-30T03:00:35.377 回答
2

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

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

于 2009-03-30T03:02:05.807 回答
1

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

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

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

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

于 2009-03-30T03:02:01.550 回答
1

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

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

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

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

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

于 2009-03-30T04:01:20.893 回答
1

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

等待按键被按下: Console.WriteLine("Press any key to continue..."); Console.Read();

于 2011-10-25T10:17:27.003 回答
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...");
        }
    }
}
于 2019-01-11T22:08:33.147 回答