annotate Util/AsyncResultBase.cs @ 104:327be9216006

Improved PML code
author Ivo Smits <Ivo@UCIS.nl>
date Sat, 11 Oct 2014 14:05:41 +0200
parents a6faa87767bb
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using System.Threading;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 using SysThreadPool = System.Threading.ThreadPool;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 namespace UCIS.Util {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6 public abstract class AsyncResultBase : IAsyncResult {
18
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
7 [ThreadStatic]
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
8 static Boolean ThreadInCallback = false;
5
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 ManualResetEvent WaitEvent = null;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 AsyncCallback Callback = null;
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 18
diff changeset
11 Object MonitorWaitHandle = new Object();
5
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 public object AsyncState { get; private set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 public bool CompletedSynchronously { get; private set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 public bool IsCompleted { get; private set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 public Exception Error { get; private set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 public WaitHandle AsyncWaitHandle {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 get {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 lock (this) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 if (WaitEvent == null) WaitEvent = new ManualResetEvent(IsCompleted);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 return WaitEvent;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 public AsyncResultBase(AsyncCallback callback, Object state) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 this.Callback = callback;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 this.AsyncState = state;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 private void CallCallback(Object state) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31 if (Callback != null) Callback(this);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 protected void SetCompleted(Boolean synchronously, Exception error) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 this.CompletedSynchronously = synchronously;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 this.Error = error;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 lock (this) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 IsCompleted = true;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 if (WaitEvent != null) WaitEvent.Set();
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 18
diff changeset
40 if (MonitorWaitHandle != null) lock (MonitorWaitHandle) Monitor.Pulse(MonitorWaitHandle);
5
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 }
7
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
42 if (Callback != null) {
18
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
43 if (synchronously && !ThreadInCallback) {
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
44 try {
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
45 ThreadInCallback = true;
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
46 Callback(this);
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
47 } finally {
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
48 ThreadInCallback = false;
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
49 }
7
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
50 } else {
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
51 SysThreadPool.QueueUserWorkItem(CallCallback);
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
52 }
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
53 }
5
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55
104
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 18
diff changeset
56 public void WaitForCompletion() {
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 18
diff changeset
57 lock (this) if (!IsCompleted) lock (MonitorWaitHandle) Monitor.Wait(MonitorWaitHandle);
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 18
diff changeset
58 }
327be9216006 Improved PML code
Ivo Smits <Ivo@UCIS.nl>
parents: 18
diff changeset
59
5
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 protected void ThrowError() {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 if (Error != null) throw Error;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 }