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

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

2010年12月05日 | 分类:开发笔记 | 标签:c#编程

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

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

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

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

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

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

最后是客户端控制台程序

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

在测试的过程中会发现第一次调用客户端输出结果:
1,2
第二次输出结果
3,4
……
结果是比较符合要求的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值