File: channels\core\basicasyncresult.cs
Project: ndp\clr\src\managedlibraries\remoting\System.Runtime.Remoting.csproj (System.Runtime.Remoting)
// ==++==
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// ==--==
/*============================================================
**
**  File:    BasicAsyncResult.cs
** 
**  Purpose: Base class for async result implementations.
**
**  Date:    Oct 21, 2001
**
===========================================================*/
 
 
using System;
using System.Threading;
 
namespace System.Runtime.Remoting.Channels
{
 
    internal class BasicAsyncResult : IAsyncResult
    {
        private AsyncCallback _asyncCallback;
        private Object _asyncState;
        private Object _returnValue;
        private Exception _exception;
 
        private bool _bIsComplete;
 
        private ManualResetEvent _manualResetEvent;
 
        
        internal BasicAsyncResult(AsyncCallback callback, Object state)
        {
            _asyncCallback = callback;
            _asyncState = state;
        } // BasicAsyncResult
 
 
        public Object AsyncState
        {
            get { return _asyncState; }
        } // AsyncState
 
        public WaitHandle AsyncWaitHandle
        {
            get 
            { 
                bool bSavedIsComplete = _bIsComplete;
                if (_manualResetEvent == null)
                {
                    lock (this)
                    {
                        if (_manualResetEvent == null)
                        {
                            _manualResetEvent = new ManualResetEvent(bSavedIsComplete);
                        }                        
                    }
                }
 
                if (!bSavedIsComplete && _bIsComplete)
                    _manualResetEvent.Set();
 
                return (WaitHandle)_manualResetEvent;
            }
        } // AsyncWaitHandle
 
        public bool CompletedSynchronously
        {
            get { return false; }
        } // CompletedSynchronously
 
        public bool IsCompleted
        {
            get { return _bIsComplete; }
        } // IsCompleted
 
        internal Exception Exception { get { return _exception; } }
 
        internal void SetComplete(Object returnValue, Exception exception)
        {
            _returnValue = returnValue;
            _exception = exception;
 
            CleanupOnComplete();
 
            _bIsComplete = true;
 
            try
            {
                if (_manualResetEvent != null)
                    _manualResetEvent.Set();
            }
            catch (Exception e)
            {
                if (_exception == null)
                    _exception = e;
            }
 
 
            // invoke the callback
            if (_asyncCallback != null)
                _asyncCallback(this);
        } // SetComplete                
 
 
        internal virtual void CleanupOnComplete()
        {
        }
    
    } // BasicAsyncResult
 
} // namespace System.Runtime.Remoting.Channels