diff 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
line wrap: on
line diff
--- a/Pml/Channels/PassivePmlChannel.cs	Sat Oct 11 14:03:31 2014 +0200
+++ b/Pml/Channels/PassivePmlChannel.cs	Sat Oct 11 14:05:41 2014 +0200
@@ -1,5 +1,6 @@
 using System;
 using UCIS.Pml;
+using UCIS.Util;
 using System.Collections.Generic;
 using System.Threading;
 
@@ -20,40 +21,33 @@
 		public abstract PmlElement ReadMessage();
 
 		public IAsyncResult BeginReadMessage(AsyncCallback callback, object state) {
-			ReadMessageAsyncResult ar = new ReadMessageAsyncResult();
-			ar.Callback = callback;
-			ar.State = state;
+			ReadMessageAsyncResult ar = new ReadMessageAsyncResult(callback, state);
 			UCIS.ThreadPool.RunCall(AsyncReadMessage, ar);
 			return ar;
 		}
 		public PmlElement EndReadMessage(IAsyncResult asyncResult) {
 			ReadMessageAsyncResult ar = (ReadMessageAsyncResult)asyncResult;
-			if (ar.Error != null) throw new Exception("The asynchronous operation could not be completed", ar.Error);
+			ar.WaitForCompletion();
+			if (ar.Error != null) throw new Exception("The asynchronous operation failed", ar.Error);
 			return ar.Message;
 		}
 
-		private struct ReadMessageAsyncResult : IAsyncResult {
-			internal object State;
+		class ReadMessageAsyncResult : AsyncResultBase {
 			internal PmlElement Message;
-			internal AsyncCallback Callback;
-			internal Exception Error;
-			internal bool Completed;
-
-			public bool CompletedSynchronously { get { return false; } }
-			public object AsyncState { get { return State; } }
-			public WaitHandle AsyncWaitHandle { get { return null; } }
-			public bool IsCompleted { get { return Completed; } }
+			public ReadMessageAsyncResult(AsyncCallback callback, Object state) : base(callback, state) { }
+			public void SetCompleted(Boolean synchronously, Exception error, PmlElement message) {
+				this.Message = message;
+				base.SetCompleted(synchronously, error);
+			}
 		}
 		private void AsyncReadMessage(object state) {
 			ReadMessageAsyncResult ar = (ReadMessageAsyncResult)state;
 			try {
-				ar.Message = ReadMessage();
-				ar.Error = null;
+				PmlElement message = ReadMessage();
+				ar.SetCompleted(false, null, message);
 			} catch (Exception ex) {
-				ar.Error = ex;
+				ar.SetCompleted(false, ex, null);
 			}
-			ar.Completed = true;
-			ar.Callback.Invoke(ar);
 		}
 	}
 }