c#进程间通讯方案之IPC通道
2013-11-25 13:48
459 查看
转载:http://www.cnphp.info/csharp-ipc-channel-remoting.html
最近一直纠结与使用多进程还是多线程来构建程序。多线程的方法似乎不错,但是一个进程可承受的线程数有有限的,并且由于每个线程都与UI有着些许关系,线程的工作大多数时间浪费在阻塞上了,效率实在不是很高。
笔者遂在google上搜索进程间通讯的方案。发现有很多种,其中IPC通道似乎是个不错的选择,支持本机的进程间通讯,可以作为备选方案之一,下面介绍以下基本的编程方法,以作备忘。
首先建立一个IPC通讯中使用的对象,其中MarshalByRefObject是必须的
[code]
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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;}
接着建一个服务端控制台程序
[code]usingSystem.Runtime.Remoting;
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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;}
最后是客户端控制台程序
[code]usingSystem.Runtime.Remoting;
[/code]
在测试的过程中会发现第一次调用客户端输出结果:
1,2
第二次输出结果
3,4
……
结果是比较符合要求的。
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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;}
最近一直纠结与使用多进程还是多线程来构建程序。多线程的方法似乎不错,但是一个进程可承受的线程数有有限的,并且由于每个线程都与UI有着些许关系,线程的工作大多数时间浪费在阻塞上了,效率实在不是很高。
笔者遂在google上搜索进程间通讯的方案。发现有很多种,其中IPC通道似乎是个不错的选择,支持本机的进程间通讯,可以作为备选方案之一,下面介绍以下基本的编程方法,以作备忘。
首先建立一个IPC通讯中使用的对象,其中MarshalByRefObject是必须的
usingSystem;
[code]
namespaceIpctest
{
publicclasstest:MarshalByRefObject
{
privateintiCount=0;
publicintcount()
{
iCount++;
returniCount;
}
publicintAdd(intx)
{
iCount+=x;
returniCount;
}
}
}
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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;}
接着建一个服务端控制台程序
usingSystem;
[code]usingSystem.Runtime.Remoting;
usingSystem.Runtime.Remoting.Channels;
usingSystem.Runtime.Remoting.Channels.Ipc;
namespaceIpctest
{
classProgram
{
staticvoidMain(string[]args)
{
IpcChannelserverchannel=newIpcChannel("testchannel");
ChannelServices.RegisterChannel(serverchannel,false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(test),"test",WellKnownObjectMode.Singleton);
Console.WriteLine("pressEntertoexit");
Console.ReadLine();
Console.WriteLine("serverstopped");
}
}
}
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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;}
最后是客户端控制台程序
usingSystem;
[code]usingSystem.Runtime.Remoting;
usingSystem.Runtime.Remoting.Channels;
usingSystem.Runtime.Remoting.Channels.Ipc;
namespaceIpctest
{
classProgram
{
staticvoidMain(string[]args)
{
IpcChanneltcc=newIpcChannel();
ChannelServices.RegisterChannel(tcc,false);
WellKnownClientTypeEntryremotEntry=newWellKnownClientTypeEntry(typeof(test),"ipc://testchannel/test");
RemotingConfiguration.RegisterWellKnownClientType(remotEntry);
testst=newtest();
Console.WriteLine("{0},{1}",st.count(),st.Add(1));
Console.ReadLine();
}
}
}
[/code]
在测试的过程中会发现第一次调用客户端输出结果:
1,2
第二次输出结果
3,4
……
结果是比较符合要求的。
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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;}
相关文章推荐
- c#进程间通讯方案之IPC通道
- 进程间的通讯——IPC通道
- unix/linux ipc 进程通讯
- 进程间的通讯(IPC)方式
- 进程间的通讯实现(IPC)的11种方法
- 利用IPC通道进行进程间通信(C#)
- Android查缺补漏(IPC篇)-- 进程间通讯之AIDL详解
- 一个进程间同步和通讯的 C# 框架
- 示例:Android使用AIDL实现跨进程通讯(IPC)
- android使用AIDL实现跨进程通讯(IPC)
- Android面试篇之IPC机制[进程之间的通讯]
- Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身
- 进程间的通讯(IPC)方式
- 8.IPC机制(六重点!!!IPC进程间通讯,自我学习总结)
- Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍
- Android IPC进程间通讯机制
- Android进程间通讯之初见(IPC,RPC,LPC,BINDER,AIDL..)
- 进程间的通讯实现(IPC)的11种方法
- 【IPC进程间通讯之三】内存映射文件Mapping File
- 【IPC进程间通讯之二】管道Pipe