命名管道服务器在没有警告的情况下退出

Named Pipes Server exits without warning

我正在尝试在服务器软件和客户端之间设置命名管道连接。

这是我的服务器代码:

class Program
{
    private static NamedPipeServerStream server = new NamedPipeServerStream("p", PipeDirection.InOut);
    static void Main(string[] args)
    {
        Action<NamedPipeServerStream> a = callBack;
        a.BeginInvoke(server, ar => { }, null);
    }

    private static void callBack(NamedPipeServerStream pipe)
    {
        pipe.WaitForConnection();
        var line = "";
        while (line != "exit")
        {
            try
            {
                StreamReader reader = new StreamReader(pipe);
                while (line != "exit")
                {
                    line = reader.ReadLine();
                    switch (line)
                    {
                        default:
                            foo();
                            break;
                    }
                }
                break;
            }
            catch (IOException)
            {
                pipe.Disconnect();
                continue;
            }
        }
    }
}

但是当我尝试运行这个应用程序时,它在启动后直接退出。

我已经使用调试器到达 WaitForConnection 行,然后它退出,没有错误或异常。 运行ning 除了服务器什么也没有。

它在未被捕获部分处理的情况下退出。我错过了什么吗?

执行在 WaitForConnection 上被阻止,直到 NamedPipeClientStream 对象与 NamedPipeServerStream 对象建立连接后才会继续。

请看这里(示例应该对您有所帮助):https://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream(v=vs.110).aspx

编辑:我误解了这个问题,最初认为这个问题与 WaitForConnection 方法的执行阻塞有关。下面的代码是对实际问题的补充以及我的解释。

问题在于您调用操作的方式。当您调用 BeginInvoke 时,它​​是在线程池线程上异步调用的。因此,您需要检查操作是否已完成,否则主线程将保持 运行 并到达终点。我已经更新了关于如何轻松做到这一点的答案

希望这段代码能帮助您理解它存在的原因! :)

        Action<NamedPipeServerStream> a = callBack;
        var result = a.BeginInvoke(server,ar => { },null);

        while (!result.IsCompleted)
        {

        }