c#进程间通讯方案之IPC通道

时间:2023-03-09 04:32:06
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:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

   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:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

最后是客户端控制台程序

   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

……

结果是比较符合要求的。

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }