C# 使用匿名管道进行本地进程间通信

目录

写在前面

代码实现

客户端进程

服务端进程

调用示例


写在前面

相对于命名管道通讯方式而言,匿名管道开销更小,更轻松便捷;缺点就是无法进行网络通讯,只能在本机使用,应用场景相对狭窄;适合于本地多进程之间的通讯,比如主节点和多个从节点之间的交互。

以下代码实现主要来自微软官网,实现了采用匿名管道将字符串从父进程发送到子进程的功能。

代码实现

客户端进程

cs 复制代码
using System;
using System.IO;
using System.IO.Pipes;

class PipeClient
{
    static void Main(string[] args)
    {
        if (args.Length > 0)
        {
            // 指定为接收端: PipeDirection.In 
            using PipeStream pipeClient = new AnonymousPipeClientStream(PipeDirection.In, args[0]);
            Console.WriteLine("[CLIENT] Current TransmissionMode: {0}.", pipeClient.TransmissionMode);

            using (StreamReader sr = new StreamReader(pipeClient))
            {
                // Display the read text to the console
                string temp;

                // Wait for 'sync message' from the server.
                do
                {
                    Console.WriteLine("[CLIENT] Wait for sync...");
                    temp = sr.ReadLine();
                }
                while (!temp.StartsWith("SYNC"));

                // Read the server data and echo to the console.
                while ((temp = sr.ReadLine()) != null)
                {
                    Console.WriteLine("[CLIENT] Echo: " + temp);
                }
            }
        }
        Console.Write("[CLIENT] Press Enter to continue...");
        Console.ReadLine();
    }
}

服务端进程

cs 复制代码
using System;
using System.IO;
using System.IO.Pipes;
using System.Diagnostics;

class PipeServer
{
    static void Main()
    {
        Process pipeClient = new Process();
        pipeClient.StartInfo.FileName = "pipeClient.exe";

        // 指定为发送端:PipeDirection.Out
        using AnonymousPipeServerStream pipeServer = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable);
        Console.WriteLine("[SERVER] Current TransmissionMode: {0}.", pipeServer.TransmissionMode);
        // Pass the client process a handle to the server.
        pipeClient.StartInfo.Arguments = pipeServer.GetClientHandleAsString();
        pipeClient.StartInfo.UseShellExecute = false;
        pipeClient.Start();

        pipeServer.DisposeLocalCopyOfClientHandle();

        try
        {
            // Read user input and send that to the client process.
            using (StreamWriter sw = new StreamWriter(pipeServer))
            {
                sw.AutoFlush = true;
                // Send a 'sync message' and wait for client to receive it.
                sw.WriteLine("SYNC");
                pipeServer.WaitForPipeDrain();
                // Send the console input to the client process.
                Console.Write("[SERVER] Enter text: ");
                sw.WriteLine(Console.ReadLine());
            }
        }
        // Catch the IOException that is raised if the pipe is broken
        // or disconnected.
        catch (IOException e)
        {
            Console.WriteLine("[SERVER] Error: {0}", e.Message);
        }

        pipeClient.WaitForExit();
        pipeClient.Close();
        Console.WriteLine("[SERVER] Client quit. Server terminating.");
        
        Console.ReadLine();
    }
}

调用示例

需要注意的是除了客户端的exe和dll,配置文件PipeClient.runtimeconfig.json也需要一并放入服务端的运行目录。

相关推荐
码农水水1 分钟前
得物Java面试被问:大规模数据的分布式排序和聚合
java·开发语言·spring boot·分布式·面试·php·wpf
AI_567814 分钟前
Airflow“3分钟上手”教程:用Python定义定时数据清洗任务
开发语言·人工智能·python
大只鹅20 分钟前
Stream使用
java·开发语言
Ulyanov25 分钟前
PyVista三维战场仿真实战
开发语言·python·tkinter·pyvista·gui开发
董世昌4130 分钟前
HTTP协议中,GET和POST有什么区别?分别适用什么场景?
java·开发语言·前端
独自破碎E31 分钟前
Java中HashMap的默认负载因子为什么设置为0.75?
java·开发语言·网络
幽络源小助理34 分钟前
SpringBoot+Vue大学城水电管理系统源码 | 后勤设备管理 | 幽络源
java·开发语言
闻林禹35 分钟前
c++并发编程
开发语言·c++
小尧嵌入式44 分钟前
【Linux开发一】类间相互使用|继承类和构造写法|虚函数实现多态|五子棋游戏|整数相除混合小数|括号使用|最长问题
开发语言·c++·算法·游戏
黎雁·泠崖44 分钟前
Java数组进阶:内存图解+二维数组全解析(底层原理+Java&C差异对比)
java·c语言·开发语言