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

    ……

    结果是比较符合要求的。

  • 相关阅读:
    Building a Space Station POJ
    Networking POJ
    POJ 1251 Jungle Roads
    CodeForces
    CodeForces
    kuangbin专题 专题一 简单搜索 POJ 1426 Find The Multiple
    The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk's pool
    The Preliminary Contest for ICPC Asia Shenyang 2019 H. Texas hold'em Poker
    The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team
    robotparser (File Formats) – Python 中文开发手册
  • 原文地址:https://www.cnblogs.com/zhaox583132460/p/3441392.html
Copyright © 2011-2022 走看看