File: System\ServiceModel\Discovery\AsyncOperationContext.cs
Project: ndp\cdf\src\NetFx40\System.ServiceModel.Discovery\System.ServiceModel.Discovery.csproj (System.ServiceModel.Discovery)
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------
namespace System.ServiceModel.Discovery
{
    using System;
    using System.ComponentModel;
    using System.Runtime;
    using System.Threading;
    using System.Xml;
 
    // WARNING: This object is not thread safe. 
    // Use SyncRoot to protect access to methods and properties as required.
    abstract class AsyncOperationContext
    {
        AsyncOperation asyncOperation;
        TimeSpan duration;        
        bool isCompleted;
        int maxResults;
        UniqueId operationId;
        Nullable<DateTime> startTime;
 
        [Fx.Tag.SynchronizationObject()]
        object syncRoot;
 
        IOThreadTimer timer;
        object userState;
 
        internal AsyncOperationContext(UniqueId operationId, int maxResults, TimeSpan duration, object userState)
        {
            Fx.Assert(operationId != null, "The operation id must be non null.");
            Fx.Assert(maxResults > 0, "The maxResults parameter must be positive.");
            Fx.Assert(duration > TimeSpan.Zero, "The duration parameter must be positive.");
 
            this.maxResults = maxResults;
            this.duration = duration;            
            this.userState = userState;
            this.operationId = operationId;
            this.syncRoot = new object();
        }
 
        public AsyncOperation AsyncOperation
        {
            get
            {
                return this.asyncOperation;
            }
            set
            {
                this.asyncOperation = value;
            }
        }
 
        public TimeSpan Duration
        {
            get
            {
                return this.duration;
            }
        }
 
        public bool IsCompleted
        {
            get
            {
                return this.isCompleted;
            }
        }
 
        public bool IsSyncOperation
        {
            get
            {
                return (UserState is SyncOperationState);
            }
        }
 
        public int MaxResults
        {
            get
            {
                return this.maxResults;
            }
        }
 
        public UniqueId OperationId
        {
            get
            {
                return this.operationId;
            }
        }
 
        public object SyncRoot
        {
            get
            {
                return syncRoot;
            }
        }
 
        public object UserState
        {
            get
            {
                return this.userState;
            }
        }
 
        public Nullable<DateTime> StartedAt
        {
            get
            {
                return this.startTime;
            }
        }
 
        public void Complete()
        {
            this.StopTimer();
            this.isCompleted = true;
        }
 
        public void StartTimer(Action<object> waitCallback)
        {
            Fx.Assert(this.timer == null, "The timer object must be null.");
            Fx.Assert(this.isCompleted == false, "The timer cannot be started if the context is closed.");
 
            this.startTime = DateTime.UtcNow;
            this.timer = new IOThreadTimer(waitCallback, this, false);
            this.timer.Set(this.Duration);
        }
 
        void StopTimer()
        {
            if (this.timer != null)
            {
                this.timer.Cancel();
                this.timer = null;
            }
        }
    }
}