一、代碼結構:
二、數據實體類:
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.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; } } } |
三、服務端服務接口和實現:
接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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); } } |
實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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); } } } |
四、服務端啟動服務:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
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(); } } } |
五、客戶端數據實體類和服務接口類與服務端相同
六、客戶端服務實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
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(); } } } } |
七、客戶端調用服務接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
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類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
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分享就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/s0611163/archive/2017/12/15/8043157.html