0
|
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 } |