【问题标题】:Windows service calling a Windows Forms application - would GUI cause problems?Windows 服务调用 Windows 窗体应用程序 - GUI 会导致问题吗?
【发布时间】:2011-09-14 13:26:19
【问题描述】:

我有一个服务器应用程序Server.exe,它侦听 TCP 端口并回复连接到它的客户端。目前它是一个 Windows 窗体应用程序,带有用于调试的 GUI(显示谁已连接和一些其他消息)。

我想创建一个 Windows 服务来启动这个 Server.exe 并确保 Server.exe 始终在运行(如果它因任何原因崩溃,请重新启动它)。该服务将通过创建一个新的ProcessServer.exe)来启动一个服务器。该服务可以在没有用户登录的情况下运行(通常是)。由于Server.exe 确实有一些 GUI,这会在没有用户登录的情况下产生任何问题吗?

(我不在乎 GUI 不可见,我只是想确保 GUI 不会阻止应用程序在 GUI 不可用/可见的上下文中正常工作(即不用户已登录))。

注意: 该应用程序不依赖于任何特定的用户输入,它还有一些长期运行的后台线程(也不依赖于用户输入)。

【问题讨论】:

    标签: .net winforms user-interface windows-services


    【解决方案1】:

    与其让您的设计受信息/调试要求驱动,不如让您的 Windows 服务本身完成所有工作,例如端口侦听和响应。然后有一个单独的 Windows 窗体应用程序仅用于调试。此应用可以向不同端口上的 Windows 服务发送信息请求,并显示结果。

    如果您必须坚持当前的方法,那么您就有问题了。默认情况下,gui 进程将在会话 0 中启动。GUI 会显示正常,但没有人会看到它。在 Vista 及更高版本中,没有交互式用户会话可以访问会话 0。

    您可以使用CreateProcessAsUser API 函数在特定用户的桌面上创建进程。但这仅在该特定用户已登录时才有效。并注意该链接中关于用户交互的注意事项。

    【讨论】:

    • 我相信我说过我不需要看任何东西。在这种情况下,我不需要 GUI。我避免将逻辑放入服务本身是有原因的。我唯一想知道的是 GUI 应用程序是否会在 Session 0 中正常运行。
    • @Kornelije,是的,在会话 0 中。如果没有人需要查看 GUI,那么 Windows 窗体应用程序需要什么?
    • 这样调试和测试会更容易。调试服务很复杂(糟糕的 VS 支持)和耗时(更改后需要重新安装)。这样,当我们需要查看(用于测试)应用程序时,我们在用户环境中将其作为普通可执行文件运行,而当我们不(在生产中)它在会话 0 中运行时。我只是想确保 GUI 获胜不要制造问题。感谢您的回复。
    • @Kornelije,您可以直接从 VS 调试 Windows 服务,而无需经历整个重新安装周期。请在此处查看我的博客条目:sleeksoft.co.uk/public/techblog/articles/20051128_1.html
    【解决方案2】:

    过去可以创建Interactive Service for Windows, however it is strongly discouraged by Microsoft。服务属性对话框的登录选项卡上有一个复选框。

    创建交互式服务的主要问题是可能会锁定服务以等待永远不会发生的用户输入。

    但是,如果您想遵循这条路线,那么this 可能是一个很好的起点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多