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

……

结果是比较符合要求的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值