Mercurial > hg > ucis.core
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); } } }