48 lines
1.7 KiB
C#
48 lines
1.7 KiB
C#
|
//----------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//----------------------------------------------------------------
|
||
|
namespace System.ServiceModel.Discovery
|
||
|
{
|
||
|
using System;
|
||
|
using System.Runtime;
|
||
|
using SR2 = System.ServiceModel.Discovery.SR;
|
||
|
|
||
|
public class DiscoveryMessageSequenceGenerator
|
||
|
{
|
||
|
static readonly DateTime DT1970 = new DateTime(1970, 1, 1);
|
||
|
|
||
|
long instanceId;
|
||
|
Uri sequenceId;
|
||
|
|
||
|
[Fx.Tag.SynchronizationObject(Blocking = false, Kind = Fx.Tag.SynchronizationKind.InterlockedNoSpin)]
|
||
|
long messageNumber;
|
||
|
|
||
|
public DiscoveryMessageSequenceGenerator()
|
||
|
: this(CreateInstanceId(), null)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
[Fx.Tag.Throws(typeof(ArgumentOutOfRangeException), "instanceId")]
|
||
|
public DiscoveryMessageSequenceGenerator(long instanceId, Uri sequenceId)
|
||
|
{
|
||
|
if (instanceId < 0 || instanceId > UInt32.MaxValue)
|
||
|
{
|
||
|
throw FxTrace.Exception.ArgumentOutOfRange("instanceId", instanceId, SR2.DiscoveryAppSequenceInstanceIdOutOfRange);
|
||
|
}
|
||
|
this.instanceId = instanceId;
|
||
|
this.sequenceId = sequenceId;
|
||
|
}
|
||
|
|
||
|
static long CreateInstanceId()
|
||
|
{
|
||
|
return (long)DateTime.Now.Subtract(DT1970).TotalSeconds;
|
||
|
}
|
||
|
|
||
|
[Fx.Tag.InheritThrows(From = "DiscoveryMessageSequenceGenerator", FromDeclaringType = typeof(DiscoveryMessageSequenceGenerator))]
|
||
|
public DiscoveryMessageSequence Next()
|
||
|
{
|
||
|
return new DiscoveryMessageSequence(this.instanceId, this.sequenceId, Threading.Interlocked.Increment(ref this.messageNumber));
|
||
|
}
|
||
|
}
|
||
|
}
|