WCF实现进程间管道通信Demo分享
程序员文章站
2023-12-19 21:04:04
一、代码结构:
二、数据实体类:
using system;
using system.collections.generic;
using syste...
一、代码结构:
二、数据实体类:
using system; using system.collections.generic; using system.linq; using system.runtime.serialization; using system.text; using system.threading.tasks; namespace datastruct { /// <summary> /// 测试数据实体类 /// </summary> [datacontract] public class testdata { [datamember] public double x { get; set; } [datamember] public double y { get; set; } } }
三、服务端服务接口和实现:
接口:
using system; using system.collections.generic; using system.linq; using system.servicemodel; using system.text; using system.threading.tasks; using datastruct; namespace wcfserver { /// <summary> /// 服务接口 /// </summary> [servicecontract] public interface iclientserver { /// <summary> /// 计算(测试方法) /// </summary> [operationcontract] double calculate(testdata data); } }
实现:
using system; using system.collections.generic; using system.linq; using system.servicemodel; using system.text; using system.threading.tasks; using datastruct; namespace wcfserver { /// <summary> /// 服务实现 /// </summary> [servicebehavior()] public class clientserver : iclientserver { /// <summary> /// 计算(测试方法) /// </summary> public double calculate(testdata data) { return math.pow(data.x, data.y); } } }
四、服务端启动服务:
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.servicemodel; using system.servicemodel.description; using system.text; using system.threading.tasks; using system.windows.forms; using utils; using wcfserver; namespace 服务端 { public partial class form1 : form { public form1() { initializecomponent(); } private void form1_load(object sender, eventargs e) { backwork.run(() => { openclientserver(); }, null, (ex) => { messagebox.show(ex.message); }); } /// <summary> /// 启动服务 /// </summary> private void openclientserver() { netnamedpipebinding wshttp = new netnamedpipebinding(); wshttp.maxbufferpoolsize = 524288; wshttp.maxreceivedmessagesize = 2147483647; wshttp.readerquotas.maxarraylength = 6553600; wshttp.readerquotas.maxstringcontentlength = 2147483647; wshttp.readerquotas.maxbytesperread = 6553600; wshttp.readerquotas.maxdepth = 6553600; wshttp.readerquotas.maxnametablecharcount = 6553600; wshttp.closetimeout = new timespan(0, 1, 0); wshttp.opentimeout = new timespan(0, 1, 0); wshttp.receivetimeout = new timespan(0, 10, 0); wshttp.sendtimeout = new timespan(0, 10, 0); wshttp.security.mode = netnamedpipesecuritymode.none; uri baseaddress = new uri("net.pipe://localhost/pipename1"); servicehost host = new servicehost(typeof(clientserver), baseaddress); servicemetadatabehavior smb = new servicemetadatabehavior(); host.description.behaviors.add(smb); servicebehaviorattribute sba = host.description.behaviors.find<servicebehaviorattribute>(); sba.maxitemsinobjectgraph = 2147483647; host.addserviceendpoint(typeof(iclientserver), wshttp, ""); host.open(); } } }
五、客户端数据实体类和服务接口类与服务端相同
六、客户端服务实现:
using datastruct; using system; using system.collections.generic; using system.linq; using system.servicemodel; using system.servicemodel.description; using system.text; using system.threading.tasks; using wcfserver; namespace dataservice { /// <summary> /// 服务实现 /// </summary> public class clientserver : iclientserver { channelfactory<iclientserver> channelfactory; iclientserver proxy; public clientserver() { createchannel(); } /// <summary> /// 创建连接客户终端wcf服务的通道 /// </summary> public void createchannel() { string url = "net.pipe://localhost/pipename1"; netnamedpipebinding wshttp = new netnamedpipebinding(); wshttp.maxbufferpoolsize = 524288; wshttp.maxreceivedmessagesize = 2147483647; wshttp.readerquotas.maxarraylength = 6553600; wshttp.readerquotas.maxstringcontentlength = 2147483647; wshttp.readerquotas.maxbytesperread = 6553600; wshttp.readerquotas.maxdepth = 6553600; wshttp.readerquotas.maxnametablecharcount = 6553600; wshttp.sendtimeout = new timespan(0, 10, 0); wshttp.security.mode = netnamedpipesecuritymode.none; channelfactory = new channelfactory<iclientserver>(wshttp, url); foreach (operationdescription op in channelfactory.endpoint.contract.operations) { datacontractserializeroperationbehavior datacontractbehavior = op.behaviors.find<datacontractserializeroperationbehavior>() as datacontractserializeroperationbehavior; if (datacontractbehavior != null) { datacontractbehavior.maxitemsinobjectgraph = 2147483647; } } } /// <summary> /// 计算(测试方法) /// </summary> public double calculate(testdata data) { proxy = channelfactory.createchannel(); try { return proxy.calculate(data); } catch (exception ex) { throw ex; } finally { (proxy as icommunicationobject).close(); } } } }
七、客户端调用服务接口:
using dataservice; using datastruct; using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.threading.tasks; using system.windows.forms; using utils; using wcfserver; namespace 客户端 { public partial class form1 : form { public form1() { initializecomponent(); } //测试1 private void button1_click(object sender, eventargs e) { button1.enabled = false; txtsum.text = string.empty; iclientserver client = new clientserver(); double num1; double num2; double sum = 0; if (double.tryparse(txtnum1.text, out num1) && double.tryparse(txtnum2.text, out num2)) { datetime dt = datetime.now; backwork.run(() => { sum = client.calculate(new testdata(num1, num2)); }, () => { double time = datetime.now.subtract(dt).totalseconds; txttime.text = time.tostring(); txtsum.text = sum.tostring(); button1.enabled = true; }, (ex) => { button1.enabled = true; messagebox.show(ex.message); }); } else { button1.enabled = true; messagebox.show("请输入合法的数据"); } } //测试2 private void button2_click(object sender, eventargs e) { button2.enabled = false; txtsum.text = string.empty; iclientserver client = new clientserver(); double num1; double num2; double sum = 0; if (double.tryparse(txtnum1.text, out num1) && double.tryparse(txtnum2.text, out num2)) { datetime dt = datetime.now; backwork.run(() => { for (int i = 0; i < 1000; i++) { sum = client.calculate(new testdata(num1, num2)); } }, () => { double time = datetime.now.subtract(dt).totalseconds; txttime.text = time.tostring(); txtsum.text = sum.tostring(); button2.enabled = true; }, (ex) => { button2.enabled = true; messagebox.show(ex.message); }); } else { button2.enabled = true; messagebox.show("请输入合法的数据"); } } } }
八、工具类backwork类:
using system; using system.collections.generic; using system.componentmodel; using system.linq; using system.text; /** * 使用方法: backwork.run(() => //dowork { }, () => //runworkercompleted { }, (ex) => //错误处理 { }); */ namespace utils { /// <summary> /// backgroundworker封装 /// 用于简化代码 /// </summary> public class backwork { /// <summary> /// 执行 /// </summary> /// <param name="dowork">dowork</param> /// <param name="workcompleted">runworkercompleted</param> /// <param name="erroraction">错误处理</param> public static void run(action dowork, action workcompleted, action<exception> erroraction) { bool isdoworkerror = false; exception doworkexception = null; backgroundworker worker = new backgroundworker(); worker.dowork += (s, e) => { try { dowork(); } catch (exception ex) { isdoworkerror = true; doworkexception = ex; } }; worker.runworkercompleted += (s, e) => { if (!isdoworkerror) { try { if (workcompleted != null) workcompleted(); } catch (exception ex) { erroraction(ex); } } else { erroraction(doworkexception); } }; worker.runworkerasync(); } } }
九、效果图示:
以上这篇wcf实现进程间管道通信demo分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。