comparison Pml/Channels/PassivePmlChannel.cs @ 104:327be9216006

Improved PML code
author Ivo Smits <Ivo@UCIS.nl>
date Sat, 11 Oct 2014 14:05:41 +0200
parents 3ab940a0c7a0
children
comparison
equal deleted inserted replaced
103:8fe322656807 104:327be9216006
1 using System; 1 using System;
2 using UCIS.Pml; 2 using UCIS.Pml;
3 using UCIS.Util;
3 using System.Collections.Generic; 4 using System.Collections.Generic;
4 using System.Threading; 5 using System.Threading;
5 6
6 namespace UCIS.Pml { 7 namespace UCIS.Pml {
7 public abstract class PassivePmlChannel : IPmlChannel { 8 public abstract class PassivePmlChannel : IPmlChannel {
18 } 19 }
19 20
20 public abstract PmlElement ReadMessage(); 21 public abstract PmlElement ReadMessage();
21 22
22 public IAsyncResult BeginReadMessage(AsyncCallback callback, object state) { 23 public IAsyncResult BeginReadMessage(AsyncCallback callback, object state) {
23 ReadMessageAsyncResult ar = new ReadMessageAsyncResult(); 24 ReadMessageAsyncResult ar = new ReadMessageAsyncResult(callback, state);
24 ar.Callback = callback;
25 ar.State = state;
26 UCIS.ThreadPool.RunCall(AsyncReadMessage, ar); 25 UCIS.ThreadPool.RunCall(AsyncReadMessage, ar);
27 return ar; 26 return ar;
28 } 27 }
29 public PmlElement EndReadMessage(IAsyncResult asyncResult) { 28 public PmlElement EndReadMessage(IAsyncResult asyncResult) {
30 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)asyncResult; 29 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)asyncResult;
31 if (ar.Error != null) throw new Exception("The asynchronous operation could not be completed", ar.Error); 30 ar.WaitForCompletion();
31 if (ar.Error != null) throw new Exception("The asynchronous operation failed", ar.Error);
32 return ar.Message; 32 return ar.Message;
33 } 33 }
34 34
35 private struct ReadMessageAsyncResult : IAsyncResult { 35 class ReadMessageAsyncResult : AsyncResultBase {
36 internal object State;
37 internal PmlElement Message; 36 internal PmlElement Message;
38 internal AsyncCallback Callback; 37 public ReadMessageAsyncResult(AsyncCallback callback, Object state) : base(callback, state) { }
39 internal Exception Error; 38 public void SetCompleted(Boolean synchronously, Exception error, PmlElement message) {
40 internal bool Completed; 39 this.Message = message;
41 40 base.SetCompleted(synchronously, error);
42 public bool CompletedSynchronously { get { return false; } } 41 }
43 public object AsyncState { get { return State; } }
44 public WaitHandle AsyncWaitHandle { get { return null; } }
45 public bool IsCompleted { get { return Completed; } }
46 } 42 }
47 private void AsyncReadMessage(object state) { 43 private void AsyncReadMessage(object state) {
48 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)state; 44 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)state;
49 try { 45 try {
50 ar.Message = ReadMessage(); 46 PmlElement message = ReadMessage();
51 ar.Error = null; 47 ar.SetCompleted(false, null, message);
52 } catch (Exception ex) { 48 } catch (Exception ex) {
53 ar.Error = ex; 49 ar.SetCompleted(false, ex, null);
54 } 50 }
55 ar.Completed = true;
56 ar.Callback.Invoke(ar);
57 } 51 }
58 } 52 }
59 } 53 }