annotate Util/AsyncResultBase.cs @ 87:9b898d8b2541

Small improvements in Windows USB device handling
author Ivo Smits <Ivo@UCIS.nl>
date Thu, 05 Jun 2014 00:46:15 +0200
parents a6faa87767bb
children 327be9216006
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;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 public object AsyncState { get; private set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 public bool CompletedSynchronously { get; private set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 public bool IsCompleted { get; private set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 public Exception Error { get; private set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 public WaitHandle AsyncWaitHandle {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 get {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 lock (this) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 if (WaitEvent == null) WaitEvent = new ManualResetEvent(IsCompleted);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 return WaitEvent;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 }
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 public AsyncResultBase(AsyncCallback callback, Object state) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 this.Callback = callback;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 this.AsyncState = state;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 }
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 private void CallCallback(Object state) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 if (Callback != null) Callback(this);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31 }
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 protected void SetCompleted(Boolean synchronously, Exception error) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 this.CompletedSynchronously = synchronously;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 this.Error = error;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 lock (this) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 IsCompleted = true;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 if (WaitEvent != null) WaitEvent.Set();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 }
7
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
40 if (Callback != null) {
18
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
41 if (synchronously && !ThreadInCallback) {
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
42 try {
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
43 ThreadInCallback = true;
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
44 Callback(this);
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
45 } finally {
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
46 ThreadInCallback = false;
a6faa87767bb AsyncResultBase: prevent recursive synchronous completion callback
Ivo Smits <Ivo@UCIS.nl>
parents: 7
diff changeset
47 }
7
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
48 } else {
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
49 SysThreadPool.QueueUserWorkItem(CallCallback);
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
50 }
4b78cc5f116b Fixes and improvements (some untested)
Ivo Smits <Ivo@UCIS.nl>
parents: 5
diff changeset
51 }
5
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 protected void ThrowError() {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 if (Error != null) throw Error;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 }