【问题标题】:How to run Windows services under a winforms application?如何在winforms应用程序下运行Windows服务?
【发布时间】:2012-06-04 06:53:34
【问题描述】:

我创建了一个 Winforms C# 应用程序来生成线程并在我们的生产服务器上运行作业。我在一个 winforms 应用程序中创建了这些作业,因为我需要一个 GUI 来配置和运行这些服务。

我们最近更换了服务器,在经过一定的空闲时间后我退出了应用程序,因此我需要让 Windows 服务保持运行,即使我退出了。问题是我需要 GUI。

使用 GUI 界面创建 Windows 服务(因为我需要它们在我注销时运行)的最佳方式是什么?

【问题讨论】:

  • @ta.speot.is 是正确的,您可能需要将应用程序拆分为 GUI 部分和注销时需要在没有 GUI 的情况下运行的服务部分。您可以通过进程间通信在这些进程之间进行通信。
  • 最好的方法是什么? WCF?是否有更简单的解决方案或 3rd 方软件可以更快地实现这一点?

标签: c# .net winforms


【解决方案1】:

如果你创建真正的Windows Services

您可以使用the ServiceController class启动、停止和获取有关服务的信息

编辑

如果您需要来自服务的数据,您可以使用 WCF 或 Socket 与服务进行通信。另一种选择是将服务的结果发布到已知文件夹中的文件中。

【讨论】:

    【解决方案2】:

    在用户会话中生成 Windows 服务 (= Interactive Windows service) 不是一个好主意,被视为一种利用。我在我的项目中通过将应用程序拆分为 GUI 和服务部分解决了这个问题,就像 kenny 说的那样。它们通过 WCF 进行通信。另一个可能是Memory-Mapped files

    【讨论】:

      【解决方案3】:

      如果您想要一种简单的方式在您的进程之间进行对话,您还可以使用NamedPipeServerStreamNamedPipeClientStream。 这项技术很古老,不是很聪明,但易于使用(如果您了解 C# 中的流管理)并且速度很快。

      唯一的缺点是它们不能直接使用 Object。但为此我使用 XML 序列化。

      • 在发送方:Object => XML String => byte[]
      • 在接收方:byte[] => XML String => Object

      为了简单起见,我总是使用我在接收端解析的 String[] 对象,就像我在应用程序的 void main(String[] args) 中所做的那样

      对于服务,您也可以使用CustomCommands,但这只是要求服务生成一个方法而不给它参数。 除非您将参数存储在您的服务可以访问它们的某个位置(即:XML 文件)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        相关资源
        最近更新 更多