e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
144 lines
3.5 KiB
C#
144 lines
3.5 KiB
C#
//----------------------------------------------------------------
|
|
// 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;
|
|
}
|
|
}
|
|
}
|
|
}
|