Mercurial > hg > ucis.core
comparison Pml/Channels/PassivePmlChannel.cs @ 0:3ab940a0c7a0
Initial commit
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 11 Sep 2012 16:28:53 +0200 |
parents | |
children | 327be9216006 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:3ab940a0c7a0 |
---|---|
1 using System; | |
2 using UCIS.Pml; | |
3 using System.Collections.Generic; | |
4 using System.Threading; | |
5 | |
6 namespace UCIS.Pml { | |
7 public abstract class PassivePmlChannel : IPmlChannel { | |
8 private bool _isOpen = true; | |
9 | |
10 public virtual bool IsOpen { get { return _isOpen; } } | |
11 public abstract void WriteMessage(PmlElement message); | |
12 | |
13 public void Dispose() { | |
14 Close(); | |
15 } | |
16 public virtual void Close() { | |
17 _isOpen = false; | |
18 } | |
19 | |
20 public abstract PmlElement ReadMessage(); | |
21 | |
22 public IAsyncResult BeginReadMessage(AsyncCallback callback, object state) { | |
23 ReadMessageAsyncResult ar = new ReadMessageAsyncResult(); | |
24 ar.Callback = callback; | |
25 ar.State = state; | |
26 UCIS.ThreadPool.RunCall(AsyncReadMessage, ar); | |
27 return ar; | |
28 } | |
29 public PmlElement EndReadMessage(IAsyncResult asyncResult) { | |
30 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)asyncResult; | |
31 if (ar.Error != null) throw new Exception("The asynchronous operation could not be completed", ar.Error); | |
32 return ar.Message; | |
33 } | |
34 | |
35 private struct ReadMessageAsyncResult : IAsyncResult { | |
36 internal object State; | |
37 internal PmlElement Message; | |
38 internal AsyncCallback Callback; | |
39 internal Exception Error; | |
40 internal bool Completed; | |
41 | |
42 public bool CompletedSynchronously { get { return false; } } | |
43 public object AsyncState { get { return State; } } | |
44 public WaitHandle AsyncWaitHandle { get { return null; } } | |
45 public bool IsCompleted { get { return Completed; } } | |
46 } | |
47 private void AsyncReadMessage(object state) { | |
48 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)state; | |
49 try { | |
50 ar.Message = ReadMessage(); | |
51 ar.Error = null; | |
52 } catch (Exception ex) { | |
53 ar.Error = ex; | |
54 } | |
55 ar.Completed = true; | |
56 ar.Callback.Invoke(ar); | |
57 } | |
58 } | |
59 } |