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

C# 在C中使用管道在进程之间通信#,c#,multithreading,ipc,C#,Multithreading,Ipc,我正在写两个程序 第一个程序向第二个程序发送文本消息 第二个程序将所有消息写入指定的文件。一旦第二个程序终止,它需要通知第一个程序它将要关闭或终止 如果第二个程序未启动,则不允许用户从第一个程序发送消息。如果用户再次打开第二个程序,则第一个程序需要允许发送消息。如果第一个程序未启动或关闭,则第二个程序也需要自动关闭 我试图写代码,但我不能得到所有的场景。在这段代码中,我能够发送文本并将文本保存在文件中。在那之后,我就不能做了 第一个程序代码如下: public void ThreadStar

我正在写两个程序

  • 第一个程序向第二个程序发送文本消息
  • 第二个程序将所有消息写入指定的文件。一旦第二个程序终止,它需要通知第一个程序它将要关闭或终止
如果第二个程序未启动,则不允许用户从第一个程序发送消息。如果用户再次打开第二个程序,则第一个程序需要允许发送消息。如果第一个程序未启动或关闭,则第二个程序也需要自动关闭

我试图写代码,但我不能得到所有的场景。在这段代码中,我能够发送文本并将文本保存在文件中。在那之后,我就不能做了

第一个程序代码如下:

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");
    }

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

在第一个程序中,您编写:

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();

两个程序中的等待句柄使用相同的名称。但是使用一个其他程序不太可能使用的名称。否则您将遇到名称冲突。

欢迎使用Stackoverflow!通常,您应该尝试通过确定故障可能来自何处来最小化发布的代码。此外,您的问题有点模糊,因为您只提到它停止工作,没有详细说明它失败时会做什么。例如,这两个程序是否仍在运行?“连接丢失”打印出来了吗?嗨@Guvante…这个代码工作正常。但是,我不能写完整的程序。通过这个程序,我可以从第一个程序和第二个程序发送消息,并将其保存在一个文件中。对于进一步的步骤,我需要帮助。我建议使用GUID作为名称,这样就不太可能发生冲突。