Mercurial > hg > ucis.core
diff Util/AsyncResultBase.cs @ 5:2933f7750542
Added read-buffering stream wrapper
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 08 Jan 2013 16:38:21 +0100 |
parents | |
children | 4b78cc5f116b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Util/AsyncResultBase.cs Tue Jan 08 16:38:21 2013 +0100 @@ -0,0 +1,45 @@ +using System; +using System.Threading; +using SysThreadPool = System.Threading.ThreadPool; + +namespace UCIS.Util { + public abstract class AsyncResultBase : IAsyncResult { + ManualResetEvent WaitEvent = null; + AsyncCallback Callback = null; + public object AsyncState { get; private set; } + public bool CompletedSynchronously { get; private set; } + public bool IsCompleted { get; private set; } + public Exception Error { get; private set; } + public WaitHandle AsyncWaitHandle { + get { + lock (this) { + if (WaitEvent == null) WaitEvent = new ManualResetEvent(IsCompleted); + return WaitEvent; + } + } + } + + public AsyncResultBase(AsyncCallback callback, Object state) { + this.Callback = callback; + this.AsyncState = state; + } + + private void CallCallback(Object state) { + if (Callback != null) Callback(this); + } + + protected void SetCompleted(Boolean synchronously, Exception error) { + this.CompletedSynchronously = synchronously; + this.Error = error; + lock (this) { + IsCompleted = true; + if (WaitEvent != null) WaitEvent.Set(); + } + if (Callback != null) SysThreadPool.QueueUserWorkItem(CallCallback); + } + + protected void ThrowError() { + if (Error != null) throw Error; + } + } +}