• c# IPC实现本机进程之间的通信


     IPC可以实现本地进程之间通信。这种用法不是太常见,常见的替代方案是使用wcf,remoting,web service,socket(tcp/pipe/...)等其他分布式部署方案来替代进程之间的通信。虽然不常见但也避免不了一些场景会使用该方案。

      应用包含:

    1)使用IPC技术实现多client与一个sever通信(不过是本机,感觉意义不大,但如果想实现本机上运行确实是一个不错的方案);

    2)使用IPC技术实现订阅者和生产者分离时,一个server接收并消费消息,客户端是生产消息的。

     View Code

      使用技巧:

    1)使用之间必须定义好一个进程之间通信的对象(该对象继承了MarshalByRefObject ,允许在支持远程处理的应用程序中跨应用程序域边界访问对象);

    复制代码
     1     public class MyProcessSendObject : MarshalByRefObject
     2     {
     3         private string taskInfo = string.Empty;
     4 
     5         public void Add(string taskInfo)
     6         {
     7             Console.WriteLine("Add:{0}", taskInfo);
     8             this.taskInfo = taskInfo;
     9         }
    10 
    11         public string GetTask()
    12         {
    13             Console.WriteLine("GetTask:{0}", taskInfo);
    14             return taskInfo;
    15         }
    16 
    17     }
    复制代码

    2)服务端是发布了一个IPC服务,供客户端段来绑定使用;

    复制代码
     1         //I PC(inter process communication)的功能可以实现同一台机器上的不同进程间通信。
     2         static void Main(string[] args)
     3         {
     4             Console.WriteLine("I'm server......");
     5             //Instantiate our server channel.
     6             IpcChannel serverchannel = new IpcChannel("testchannel");
     7             //Register the server channel.
     8             ChannelServices.RegisterChannel(serverchannel, false);
     9             //Register this service type.
    10             RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyProcessSendObject), "myObj", WellKnownObjectMode.Singleton);
    
    13 Console.WriteLine("press Enter to exit"); 14 Console.ReadLine(); 15 Console.WriteLine("server stopped"); 16 }
    复制代码

    3)客户端使用时需要绑定服务端发布的地址,之后获取发布的对象(暂时可以这么理解:数据的传递和同步是通过对象序列化、反序列化),在客户端操作该对象时实际上是操作了服务端的对象。

    复制代码
     1         static void Main(string[] args)
     2         {
     3             Console.WriteLine("I'm client......");
     4             IpcChannel tcc = new IpcChannel();
     5             ChannelServices.RegisterChannel(tcc, false);
     6 
     7             MyProcessSendObject myObj = (MyProcessSendObject)Activator.GetObject(typeof(MyProcessSendObject), "ipc://testchannel/myObj");
     8             
     9             Console.WriteLine("client send myvalue start");
    10             myObj.Add("Task 1");
    11             myObj.GetTask();
    12             myObj.Add("Task 2");
    13             myObj.GetTask();
    14             Console.WriteLine("client send myvalue complete");
    15             Console.ReadLine();
    16         }
    复制代码

    工程结构:

    测试:

  • 相关阅读:
    27. 移除元素
    axios调用webapi报错
    MySql重装以后,修改数据库路径,打开以前的数据库报Table 'XX库.XX表' doesn't exist错误的解决办法
    SqlServer2012,设置指定数据库对指定用户开放权限
    win10无法访问服务器上的共享文件夹怎么设置,提示:你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问
    Vs2017的git的坑
    jira6.3.6创建问题不自动发邮件通知的问题
    在windows下面配置redis集群遇到的一些坑
    SqlServer2008 无法修改表,超时时间已到 在操作完成之前超时解决方法
    小程序中也可以使用三元运算符且可嵌套使用
  • 原文地址:https://www.cnblogs.com/Jaasdsa/p/8556479.html
Copyright © 2020-2023  润新知