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;
+		}
+	}
+}