【问题标题】:Using Named Pipes to communicate between Winforms and Windows service applications with NamedPipeWrapper通过 NamedPipeWrapper 使用 Named Pipes 在 Winforms 和 Windows 服务应用程序之间进行通信
【发布时间】:2019-11-27 15:06:33
【问题描述】:

我正在尝试使用 NamedPipeWrapper (https://github.com/acdvorak/named-pipe-wrapper) 在 winforms 应用程序和 Windows 服务之间进行通信,但我遇到了服务器端问题,即服务。

代码在那里接收消息,但是当服务正常运行时,什么都没有发生,并且通过 VS 上的调试运行告诉我永远无法到达代码。我可以让它工作的唯一方法是如果我创建一个意味着服务始终持续工作的函数:

        public NamedPipeServer<string> server = new NamedPipeServer<string>("NamedPipe");
        private readonly ISet<string> client = new HashSet<string>();

public WinService()
        {
            InitializeComponent();

            server.ClientConnected += OnClientConnected;
            server.ClientDisconnected += OnClientDisconnected;
            server.ClientMessage += OnClientMessage;
            server.Error += OnError;
            server.Start();
            while (KeepRunning)
            { }
            server.Stop();
        }

        private bool KeepRunning
        {
            get
            {
                if (sc.Status.ToString() == "Running")
                    return false;
                return true;
            }
        }

github 文章上的示例代码显示了控制台应用程序保持关闭状态,但我担心它会停止服务的其余部分运行(我正在使用计时器来触发事件)。

这个系统会导致计时器停止运行吗?有没有什么方法可以让服务等待来自命名管道的消息而不使用这种方法?这种方法似乎使用了大量内存(~300mb),而我计划添加的一些服务器可能没有多余的内存。

【问题讨论】:

  • 我们通过 httpsocket (web-socket-sharp github.com/sta/websocket-sharp) 进行通信,并在服务的 OnStart-Method 中启动 httpserver 并在 OnStop-Method 中停止它。构造函数只持有 InitializeComponent()

标签: c# service pipe named-pipes


【解决方案1】:

我正在尝试使用 NamedPipeWrapper (https://github.com/acdvorak/named-pipe-wrapper) 在 winforms 应用程序和 Windows 服务之间进行通信,但我遇到了服务器端问题,即服务。

在编写服务时调试服务是出了名的困难。他们必须通过服务系统注册和启动的方式。需要手动附加调试器。他们can not display a UI since Vista的部分。

有些人已经开始在控制台应用程序中进行服务调试和开发。控制台没有使模拟服务环境变得困难的包袱,并且您有一种输出调试消息的方法。当然,您也可以完全摆脱服务,使用诸如 TaskSheduler 之类的东西。它拥有所有的权力,然后是一些权力,但没有任何问题。甚至微软也已经将服务从服务中转移到了那里。

【讨论】:

  • 是的,我已经尝试将其重做为控制台应用程序和 winform,两者都可以正常工作。这似乎与服务的行为有关,但我无法确定它,因为正如你所说,它们很难调试。
  • @CarlOnFire 防火墙和权限浮现在脑海中。通常这些问题是有限的,尤其是在本地主机部分。也许其中一些设置为真的激进?
【解决方案2】:

对于这个包,windows 服务似乎作为代码的“服务器”端工作,但将 winforms 应用程序作为服务器,将服务作为客户端将起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2018-11-19
    相关资源
    最近更新 更多