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