您的位置:首页 > 编程语言 > C#

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

2013-11-25 13:48 459 查看
转载:http://www.cnphp.info/csharp-ipc-channel-remoting.html

最近一直纠结与使用多进程还是多线程来构建程序。多线程的方法似乎不错,但是一个进程可承受的线程数有有限的,并且由于每个线程都与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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: