0
|
1 ???using System; |
|
2 using UCIS.Pml; |
104
|
3 using UCIS.Util; |
0
|
4 using System.Collections.Generic; |
|
5 using System.Threading; |
|
6 |
|
7 namespace UCIS.Pml { |
|
8 public abstract class PassivePmlChannel : IPmlChannel { |
|
9 private bool _isOpen = true; |
|
10 |
|
11 public virtual bool IsOpen { get { return _isOpen; } } |
|
12 public abstract void WriteMessage(PmlElement message); |
|
13 |
|
14 public void Dispose() { |
|
15 Close(); |
|
16 } |
|
17 public virtual void Close() { |
|
18 _isOpen = false; |
|
19 } |
|
20 |
|
21 public abstract PmlElement ReadMessage(); |
|
22 |
|
23 public IAsyncResult BeginReadMessage(AsyncCallback callback, object state) { |
104
|
24 ReadMessageAsyncResult ar = new ReadMessageAsyncResult(callback, state); |
0
|
25 UCIS.ThreadPool.RunCall(AsyncReadMessage, ar); |
|
26 return ar; |
|
27 } |
|
28 public PmlElement EndReadMessage(IAsyncResult asyncResult) { |
|
29 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)asyncResult; |
104
|
30 ar.WaitForCompletion(); |
|
31 if (ar.Error != null) throw new Exception("The asynchronous operation failed", ar.Error); |
0
|
32 return ar.Message; |
|
33 } |
|
34 |
104
|
35 class ReadMessageAsyncResult : AsyncResultBase { |
0
|
36 internal PmlElement Message; |
104
|
37 public ReadMessageAsyncResult(AsyncCallback callback, Object state) : base(callback, state) { } |
|
38 public void SetCompleted(Boolean synchronously, Exception error, PmlElement message) { |
|
39 this.Message = message; |
|
40 base.SetCompleted(synchronously, error); |
|
41 } |
0
|
42 } |
|
43 private void AsyncReadMessage(object state) { |
|
44 ReadMessageAsyncResult ar = (ReadMessageAsyncResult)state; |
|
45 try { |
104
|
46 PmlElement message = ReadMessage(); |
|
47 ar.SetCompleted(false, null, message); |
0
|
48 } catch (Exception ex) { |
104
|
49 ar.SetCompleted(false, ex, null); |
0
|
50 } |
|
51 } |
|
52 } |
|
53 } |