【问题标题】:Benefits of console app over windows service控制台应用程序优于 Windows 服务的优势
【发布时间】:2013-09-05 02:51:40
【问题描述】:

我有一个 .Net 控制台应用程序,它将使用预定事件启动,调用 mweb 服务方法并关闭。每小时/每天运行一次。虽然实现没有任何“错误”,但我想知道将其实现为 Windows 服务是否有任何好处。

有没有人认为在这种情况下最佳做法是什么?

【问题讨论】:

    标签: .net


    【解决方案1】:

    我发现 Windows 服务很难调试,所以我倾向于只在以下情况下使用它们:

    (A) 我正在做的事情相当复杂或

    (B) 需要一直运行(例如:监控某些东西的变化)

    我发现大多数事情通常可以通过控制台应用程序、一些命令行参数和 Windows 调度程序来完成。

    【讨论】:

    • 涵盖了我所有的想法;-p
    • 您可以使用 VS.NET 中的“附加到进程”选项相当轻松地调试 Windows 服务。安装服务时创建调试版本。然后在它运行时附加到它并设置断点。像黄油一样为我工作。
    【解决方案2】:

    服务在三个方面不同于应用程序:

    1. 它在没有用户登录系统的情况下运行
    2. 它不能有任何用户界面(控制台也是一个 UI)
    3. 它可以在提升的权限(SYSTEM 帐户)下运行,从而执行用户不允许的操作。

    这里要问的问题是:您需要服务可以为您提供的不同选项吗?如果答案是否定的,那么不要使用服务。

    我从您的问题推断出您需要一个没有任何用户界面的后台应用程序(上面的第 2 项)。您似乎不需要项目 1 或 3。您可以通过不创建一个没有任何窗口(控制台或其他)的纯后台应用程序。只需创建一个简单的 Windows 应用程序并进行更改

    static class Program
    {       
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
    

    static class Program
    {       
        [STAThread]
        static void Main()
        {
            // Application.EnableVisualStyles();
            // Application.SetCompatibleTextRenderingDefault(false);
            // Application.Run(new Form1());
    
            DoWhateverYouWant();
        }
    }
    

    哦,是的,Chris 完全正确地认为调试服务真的很痛苦!

    【讨论】:

    • 我们使用Windows(Server 2003) Scheduler来启动一个控制台APP,你可以指定不同的用户
    • 好提示!也适用于 XP 中的 TaskScheduler。
    • 是的,但在 Windows 2008 中(我假设是 Vista 但不确定)该帐户不会自动获得本地“作为服务登录”权限,并记住在带有 UAC 的 Windows 2008 中您必须拥有管理员几乎可以做任何事情的权利……服务比 2k8 中的任务简单得多
    • 哎呀,我的意思是上面评论中的“作为批处理登录”而不是“作为服务登录”
    【解决方案3】:

    我认为你所做的是最好的做法。没有什么比添加自己的服务只是为了定期做一些小事的应用程序更让我讨厌的了。随着 >Vista 中更新的事件日志/任务调度程序集成,真正需要服务的应用程序更少了,而且如果他们需要,就可以按需提供。

    你正在让世界变得更美好。

    :-)

    哦,作为一个控制台应用程序,您可以在需要时轻松手动运行它,这对可调试性非常有用。

    澄清:继续,你做对了。

    【讨论】:

      【解决方案4】:

      好处:如果您的机器重新启动(即服务器),您无需登录即可重新开始工作。

      我同意调试 Windows 服务很糟糕!这太可怕了,MS 应该真正解决调试服务的能力。

      但是...有一些免费软件工具可以极大地帮助该过程。 Anderson Imes 有一个很好的实用程序,它使编写 Windows 服务就像编写控制台应用程序一样,即使在调试周期中也是如此。

      http://theimes.com/files/查看他的服务调试实用程序

      关于他的实现最好的部分是它是代码中的 1 行更改,如果您不希望在生产实例中使用他的库,您可以使用 #if DEBUG 参数轻松管理。

      【讨论】:

        【解决方案5】:

        调试服务有一个简单的解决方法。您创建了一个组合控制台/服务应用程序。

        您检查一些命令行参数(例如 -debug),然后执行您的 OnStart 代码,等待按键,执行 OnStop 代码。

        我使用相同的方法来提供一个界面来从同一个 EXE 安装、卸载、启动和停止我的服务。

        【讨论】:

          【解决方案6】:

          需要考虑的重要一点是控制台应用程序支持 System.Drawing 命名空间,这意味着您可以打印。它可以在 Windows 服务中使用,但不受支持且不完全稳定。

          【讨论】:

            【解决方案7】:

            Creego 的 2 分和 treb 的 3 分是不可否认的。但是,我发现 SQL Server Agent 05/08/R2 是一个非常可靠和有用的任务调度程序。它比 Windows 任务计划更可靠,您不必担心批处理权限或有用户登录。

            我有一个后台系统程序,它通过 SQL Server 代理每 2 分钟运行一次。我强烈考虑将其转换为 Windows 服务,但我无法证明它的合理性。

            不过,在另一种情况下,天平很容易倾斜。

            【讨论】:

              【解决方案8】:

              这不是你的问题,但我通常将这两种方法结合起来。

              我使用控制台进行调试,并使用共享相同库和规则的 Windows 服务。

              【讨论】:

                猜你喜欢
                • 2012-05-03
                • 2014-12-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-12-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多