zoukankan      html  css  js  c++  java
  • c#进程间通讯方案之IPC通道

    转载:http://www.cnphp.info/csharp-ipc-channel-remoting.html

    最近一直纠结与使用多进程还是多线程来构建程序。多线程的方法似乎不错,但是一个进程可承受的线程数有有限的,并且由于每个线程都与UI有着些许关系,线程的工作大多数时间浪费在阻塞上了,效率实在不是很高。

    笔者遂在google上搜索进程间通讯的方案。发现有很多种,其中IPC通道似乎是个不错的选择,支持本机的进程间通讯,可以作为备选方案之一,下面介绍以下基本的编程方法,以作备忘。

    首先建立一个IPC通讯中使用的对象,其中MarshalByRefObject 是必须的

       1:  using System;
       2:   
       3:  namespace Ipctest
       4:  {
       5:      public class test:MarshalByRefObject
       6:      {
       7:          private int iCount = 0;
       8:          public int count()
       9:          {
      10:              iCount++;
      11:              return iCount;
      12:          }
      13:   
      14:          public int Add(int x)
      15:          {
      16:              iCount += x;
      17:              return iCount;
      18:          }
      19:      }
      20:  }

    接着建一个服务端控制台程序

       1:  using System;
       2:  using System.Runtime.Remoting;
       3:  using System.Runtime.Remoting.Channels;
       4:  using System.Runtime.Remoting.Channels.Ipc;
       5:   
       6:  namespace Ipctest
       7:  {
       8:      class Program
       9:      {
      10:          static void Main(string[] args)
      11:          {
      12:             IpcChannel serverchannel = new IpcChannel("testchannel");
      13:              ChannelServices.RegisterChannel(serverchannel,false);
      14:              RemotingConfiguration.RegisterWellKnownServiceType(typeof(test), "test", WellKnownObjectMode.Singleton);
      15:              Console.WriteLine("press Enter to exit");
      16:              Console.ReadLine();
      17:              Console.WriteLine("server stopped");
      18:          }
      19:      }
      20:  }

    最后是客户端控制台程序

       1:  using System;
       2:  using System.Runtime.Remoting;
       3:  using System.Runtime.Remoting.Channels;
       4:  using System.Runtime.Remoting.Channels.Ipc;
       5:   
       6:  namespace Ipctest
       7:  {
       8:      class Program
       9:      {
      10:          static void Main(string[] args)
      11:          {
      12:              IpcChannel tcc = new IpcChannel();
      13:              ChannelServices.RegisterChannel(tcc,false);
      14:              WellKnownClientTypeEntry remotEntry = new WellKnownClientTypeEntry(typeof(test), "ipc://testchannel/test");
      15:              RemotingConfiguration.RegisterWellKnownClientType(remotEntry);
      16:   
      17:              test st = new test();
      18:              Console.WriteLine("{0},{1}",st.count(),st.Add(1));
      19:              Console.ReadLine();
      20:          }
      21:      }
      22:  }

    在测试的过程中会发现第一次调用客户端输出结果:

    1,2

    第二次输出结果

    3,4

    ……

    结果是比较符合要求的。

  • 相关阅读:
    APB协议
    AHB总线协议(一)
    C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系
    深入理解C++内存管理机制
    c/c++内存机制(一)(转)
    与临时对象的斗争(下)
    与临时对象的斗争(上)ZZ
    C++异常处理解析: 异常的引发(throw), 捕获(try catch)、异常安全
    qt5信息提示框QMessageBox用法
    红黑树
  • 原文地址:https://www.cnblogs.com/zhaox583132460/p/3441392.html
Copyright © 2011-2022 走看看