File: System\Activities\DurableInstancing\LoadRetryExponentialBackoffStrategy.cs
Project: ndp\cdf\src\NetFx40\System.Activities.DurableInstancing\System.Activities.DurableInstancing.csproj (System.Activities.DurableInstancing)
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
 
namespace System.Activities.DurableInstancing
{
    using System;
 
    class LoadRetryExponentialBackoffStrategy : ILoadRetryStrategy
    {
        readonly TimeSpan DefaultBackoffLimit = TimeSpan.FromSeconds(10);
        readonly TimeSpan DefaultBackoffMultiplier = TimeSpan.FromMilliseconds(100);
        readonly int expLimit = (int)(Math.Log(Int32.MaxValue, 2)) - 1;
        readonly TimeSpan multiplier;
        readonly TimeSpan maxDelay;
 
        Random random = new Random(DateTime.Now.Millisecond);
 
        public LoadRetryExponentialBackoffStrategy()
        {
            this.multiplier = DefaultBackoffMultiplier;
            this.maxDelay = DefaultBackoffLimit;   
        }
 
        public TimeSpan RetryDelay(int retryAttempt)
        {
            int power = Math.Min(retryAttempt, this.expLimit);
 
            return TimeSpan.FromMilliseconds
            (
                Math.Min
                (
                    this.maxDelay.TotalMilliseconds,
                    this.multiplier.TotalMilliseconds * random.Next(1, ((2 << power) - 1))
                )
            );
        }
 
    }
}