SimpleAsyncResult

using System;
using System.Threading;

namespace APMResearch
{
    public delegate T Func<T>();

    public class SimpleAsyncResult<T> :IAsyncResult
    {
        private volatile int _mIsCompleted;
        private readonly ManualResetEvent _asyncWaitHandle;
        private readonly AsyncCallback _callback;
        private readonly object _asyncState;

        private Exception _exception;
        private T _result;

        private SimpleAsyncResult(Func<T> work,AsyncCallback callback,object state )
        {
            _callback = callback;
            _asyncState = state;
            _asyncWaitHandle=new ManualResetEvent(false);

            RunWorkAsynchronously(work);
        }

        public bool IsCompleted
        {
            get { return _mIsCompleted == 1; }
        }

        public WaitHandle AsyncWaitHandle
        {
            get { return _asyncWaitHandle; }
        }

        public object AsyncState
        {
            get { return _asyncState; }
        }

        public bool CompletedSynchronously
        {
            get { return false; }
        }

        private void RunWorkAsynchronously(Func<T> work)
        {
            ThreadPool.QueueUserWorkItem(delegate
                                             {
                                                 try
                                                 {
                                                     _result = work();
                                                 }
                                                 catch (Exception e)
                                                 {

                                                     _exception = e;
                                                 }
                                                 finally
                                                 {
                                                     _mIsCompleted = 1;
                                                     _asyncWaitHandle.Set();
                                                     if (_callback != null)
                                                         _callback(this);
                                                 }
                                             });
        }

        public T End()
        {
            if(_mIsCompleted!=1)
            {
                _asyncWaitHandle.WaitOne();
                _asyncWaitHandle.Close();
            }

            if (_exception != null)
                throw _exception;

            return _result;
        }
    }
}

posted @ 2012-07-04 22:14  HelloWorld.Michael  阅读(149)  评论(0)    收藏  举报