在 C# 中使用管道在进程之间进行通信

Posted

技术标签:

【中文标题】在 C# 中使用管道在进程之间进行通信【英文标题】:Communicating between Processes using Pipes in C# 【发布时间】:2013-05-28 16:16:25 【问题描述】:

我正在写两个程序

第一个程序向第二个程序发送文本消息。 第二个程序将所有消息写入指定文件。一旦第二个程序终止,它需要通知第一个程序它将关闭或终止。

如果第二个程序未启动,则不应允许用户从第一个程序发送消息。如果用户再次打开第二个程序,则第一个程序需要允许发送消息。如果第一个程序未启动或关闭,则第二个程序也需要自动关闭。

我尝试编写代码,但无法获得所有场景。在这段代码中,我可以发送文本并将文本保存在文件中。在那之后,我无法做到

第一个程序代码在这里:

public void ThreadStartClient(object obj)


        ManualResetEvent syncServer = (ManualResetEvent)obj;

        using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("PipeTo"))
        

            pipeStream.Connect();
            Console.WriteLine("[First program] Pipe Connection established");
            using (StreamWriter sw = new StreamWriter(pipeStream))
            
                sw.AutoFlush = true;
                string message;
                Console.WriteLine("Please type a message and press [ENTER], or type 'quit' to exit the program");
                while ((message = Console.ReadLine()) != null)
                
                    if (message == "quit")
                    
                        break;
                    
                    try
                    
                        sw.WriteLine(message);
                    
                    catch (Exception ex)
                    
                       // pipeStream.Connect();
                    
                
            
        
    

第二个程序代码在这里:

 public void ThreadStartServer()
    
        using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("PipeTo"))
        
            Console.WriteLine("[Second program] Pipe Created");
            pipeStream.WaitForConnection();
            Console.WriteLine("[Second program] Pipe connection established");
            StreamWriter sw1 = new StreamWriter("C:\\ServerEXE\\DemoTest.txt", true);


            using (StreamReader sr = new StreamReader(pipeStream))
            
                string message;
                while ((message = sr.ReadLine()) != null)
                
                    sw1.WriteLine(message);
                    sw1.Flush();
                    Console.WriteLine("0", message);
                
            
        
        Console.WriteLine("Connection lost");
    

【问题讨论】:

欢迎来到 ***!通常,您应该通过尝试确定故障可能来自何处来尝试最小化您发布的代码。此外,您的问题有点模糊,因为您只提到它停止工作,而没有详细说明它在失败时会做什么。例如,这两个程序是否仍在运行?是否打印“连接丢失”? 嗨@Guvante...此代码运行良好。但是,我无法编写完整的程序。通过这个程序,我可以从第一个程序和第二个程序发送消息,可以保存在一个文件中。对于进一步的步骤,我需要帮助。 【参考方案1】:

我建议第二个程序创建一个名为 EventWaitHandle 的程序并将其状态设置为已发出信号。第一个程序可以测试事件以查看它是否已发出信号。如果是,那么它可以发送消息。

在第一个程序中,你写:

private EventWaitHandle SendMessageEvent;
private const string WaitHandleName = "UniqueNameForThisHandle";

void InitializeWaitHandle()

    SendMessageEvent = new EventWaitHandle(false, EventResetMode.ManualReset, WaitHandleName);

而且,要发送消息,您首先要检查等待句柄:

if (SendMessageEvent.WaitOne(0))

    // event is signaled, so send the message

第二个程序打开等待句柄并将其状态设置为信号:

void InitializeWaitHandle()

    SendMessageEvent = new EventWaitHandle(false, EventResetMode.ManualReset, WaitHandleName);
    SendMessageEvent.Set();

当第二个程序关闭时,或者如果您不希望它接收消息,只需调用Reset

SendMessageEvent.Reset();

在两个程序中为等待句柄使用相同的名称。但请使用其他程序不太可能使用的名称。否则会发生名称冲突。

【讨论】:

我建议使用 GUID 作为名称,这样不太可能发生冲突。

以上是关于在 C# 中使用管道在进程之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章

在c#中使用命名管道在两个进程之间进行双工操作

Windows 服务和 Web 服务之间的进程间通信

C# 两个进程之间通讯(管道通信 )

使用管道在父进程和子进程之间进行通信的问题

在 C 中使用管道在父子之间创建双向通信

C - 在顶层和底层进程之间进行通信