The Labs \ Source Viewer \ SSCLI \ System.Runtime.Remoting.Channels \ BasicAsyncResult

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /*============================================================
  16. **
  17. **  File:    BasicAsyncResult.cs
  18. **
  19. **  Purpose: Base class for async result implementations.
  20. **
  21. **  Date:    Oct 21, 2001
  22. **
  23. ===========================================================*/
  24. using System;
  25. using System.Threading;
  26. namespace System.Runtime.Remoting.Channels
  27. {
  28.    
  29.     internal class BasicAsyncResult : IAsyncResult
  30.     {
  31.         private AsyncCallback _asyncCallback;
  32.         private object _asyncState;
  33.         private object _returnValue;
  34.         private Exception _exception;
  35.        
  36.         private bool _bIsComplete;
  37.        
  38.         private ManualResetEvent _manualResetEvent;
  39.        
  40.        
  41.         internal BasicAsyncResult(AsyncCallback callback, object state)
  42.         {
  43.             _asyncCallback = callback;
  44.             _asyncState = state;
  45.         }
  46.         // BasicAsyncResult
  47.        
  48.         public object AsyncState {
  49.             get { return _asyncState; }
  50.         }
  51.         // AsyncState
  52.         public WaitHandle AsyncWaitHandle {
  53.             get {
  54.                 bool bSavedIsComplete = _bIsComplete;
  55.                 if (_manualResetEvent == null) {
  56.                     lock (this) {
  57.                         if (_manualResetEvent == null) {
  58.                             _manualResetEvent = new ManualResetEvent(bSavedIsComplete);
  59.                         }
  60.                     }
  61.                 }
  62.                
  63.                 if (!bSavedIsComplete && _bIsComplete)
  64.                     _manualResetEvent.Set();
  65.                
  66.                 return (WaitHandle)_manualResetEvent;
  67.             }
  68.         }
  69.         // AsyncWaitHandle
  70.         public bool CompletedSynchronously {
  71.             get { return false; }
  72.         }
  73.         // CompletedSynchronously
  74.         public bool IsCompleted {
  75.             get { return _bIsComplete; }
  76.         }
  77.         // IsCompleted
  78.         internal Exception Exception {
  79.             get { return _exception; }
  80.         }
  81.        
  82.         internal void SetComplete(object returnValue, Exception exception)
  83.         {
  84.             _returnValue = returnValue;
  85.             _exception = exception;
  86.            
  87.             CleanupOnComplete();
  88.            
  89.             _bIsComplete = true;
  90.            
  91.             try {
  92.                 if (_manualResetEvent != null)
  93.                     _manualResetEvent.Set();
  94.             }
  95.             catch (Exception e) {
  96.                 if (_exception == null)
  97.                     _exception = e;
  98.             }
  99.             catch {
  100.                 if (_exception == null)
  101.                     _exception = new Exception(CoreChannel.GetResourceString("Remoting_nonClsCompliantException"));
  102.             }
  103.            
  104.            
  105.             // invoke the callback
  106.             if (_asyncCallback != null)
  107.                 _asyncCallback(this);
  108.         }
  109.         // SetComplete
  110.        
  111.         internal virtual void CleanupOnComplete()
  112.         {
  113.         }
  114.        
  115.     }
  116.     // BasicAsyncResult
  117. }
  118. // namespace System.Runtime.Remoting.Channels

Developer Fusion