Mercurial > hg > ucis.core
annotate Util/AsyncResultBase.cs @ 77:b5e27116bd2a
NaCl: fixed MAC/hash verification code
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 11 Feb 2014 17:45:33 +0100 |
parents | a6faa87767bb |
children | 327be9216006 |
rev | line source |
---|---|
5 | 1 ???using System; |
2 using System.Threading; | |
3 using SysThreadPool = System.Threading.ThreadPool; | |
4 | |
5 namespace UCIS.Util { | |
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 | 9 ManualResetEvent WaitEvent = null; |
10 AsyncCallback Callback = null; | |
11 public object AsyncState { get; private set; } | |
12 public bool CompletedSynchronously { get; private set; } | |
13 public bool IsCompleted { get; private set; } | |
14 public Exception Error { get; private set; } | |
15 public WaitHandle AsyncWaitHandle { | |
16 get { | |
17 lock (this) { | |
18 if (WaitEvent == null) WaitEvent = new ManualResetEvent(IsCompleted); | |
19 return WaitEvent; | |
20 } | |
21 } | |
22 } | |
23 | |
24 public AsyncResultBase(AsyncCallback callback, Object state) { | |
25 this.Callback = callback; | |
26 this.AsyncState = state; | |
27 } | |
28 | |
29 private void CallCallback(Object state) { | |
30 if (Callback != null) Callback(this); | |
31 } | |
32 | |
33 protected void SetCompleted(Boolean synchronously, Exception error) { | |
34 this.CompletedSynchronously = synchronously; | |
35 this.Error = error; | |
36 lock (this) { | |
37 IsCompleted = true; | |
38 if (WaitEvent != null) WaitEvent.Set(); | |
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 | 52 } |
53 | |
54 protected void ThrowError() { | |
55 if (Error != null) throw Error; | |
56 } | |
57 } | |
58 } |