为啥我的 NamedPipeServerStream 不等待?

Posted

技术标签:

【中文标题】为啥我的 NamedPipeServerStream 不等待?【英文标题】:Why doesn't my NamedPipeServerStream wait?为什么我的 NamedPipeServerStream 不等待? 【发布时间】:2010-04-07 18:58:21 【问题描述】:

我正在使用 NamedPipeServerStream 在两个进程之间进行通信。这是我初始化和连接管道的代码:

void Foo(IHasData objectProvider)

    Stream stream = objectProvider.GetData();
    if (stream.Length > 0)
    
        using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("VisualizerPipe", PipeDirection.Out, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous))
        
            string currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string uiFileName = Path.Combine(currentDirectory, "VisualizerUIApplication.exe");
            Process.Start(uiFileName);
            if(pipeServer.BeginWaitForConnection(PipeConnected, this).AsyncWaitHandle.WaitOne(5000))
            
                while (stream.CanRead)
                
                    pipeServer.WriteByte((byte)stream.ReadByte());
                
            
            else
            
                throw new TimeoutException("Pipe connection to UI process timed out.");
            
        
    


private void PipeConnected(IAsyncResult e)


但它似乎永远不会等待。我经常遇到以下异常:

System.InvalidOperationException:管道尚未连接。 在 System.IO.Pipes.PipeStream.CheckWriteOperations() 在 System.IO.Pipes.PipeStream.WriteByte(字节值) 在 PeachesObjectVisualizer.Visualizer.Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)

我认为等待返回后,一切都应该准备就绪。

如果我使用 pipeServer.WaitForConnection() 一切正常,但如果管道未连接,则挂起应用程序不是一种选择。

【问题讨论】:

【参考方案1】:

您需要致电EndWaitForConnection。

var asyncResult = pipeServer.BeginWaitForConnection(PipeConnected, this);

if (asyncResult.AsyncWaitHandle.WaitOne(5000))

    pipeServer.EndWaitForConnection(asyncResult);

    // ...

请参阅:IAsyncResult design pattern。

【讨论】:

我尝试了这种方法,现在它在连接前等待大约 10 秒,但是当我不使用 BeginWait 时,它会立即连接。根据 MSDN AsyncWaitHandle.WaitOne(5000) 阻塞直到发出信号,但显然情况并非如此。 抱歉,我的复制代码有误,导致它挂了一会儿。我修复了代码,现在可以了。谢谢! 您介意分享您为修复它所做的工作吗?我也有同样的问题。

以上是关于为啥我的 NamedPipeServerStream 不等待?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 PHP 会话会死掉?为啥我不能恢复它们?

为啥我的碰撞测试总是返回“真”,为啥图像矩形的位置总是错误的 (0, 0)?

NPM 启动错误上的 ENOENT。为啥我会收到此错误,为啥要查找“我的图片”目录?

为啥 main 前面有一个 int ,为啥我的教授会排除它? [复制]

为啥我的 Entity Framework Code First 代理集合为空,为啥我不能设置它?

为啥我的 UISearchController 很慢?