/// <summary>
        /// Executes the specified long running action.
        /// </summary>
        /// <param name="lb">The load balancer.</param>
        /// <param name="longRunningAction">The long running action, i.e. an action that will execute in steps by means of an enumerator.</param>
        /// <param name="maxMillisecondsUsedPerFrame">The maximum milliseconds to use per frame.</param>
        /// <returns>>A handle that can be used to Stop, pause and resume the action.</returns>
        public static ILoadBalancedHandle Execute(this ILoadBalancer lb, IEnumerator longRunningAction, int maxMillisecondsUsedPerFrame)
        {
            Ensure.ArgumentNotNull(longRunningAction, "longRunningAction");

            if (_longActions == null)
            {
                _longActions = new Queue <RecycledLongRunningAction>(1);
            }

            RecycledLongRunningAction lra;

            if (_longActions.Count > 0)
            {
                lra      = _longActions.Dequeue();
                lra.iter = longRunningAction;
                lra.maxMillisecondsUsedPerFrame = maxMillisecondsUsedPerFrame;
            }
            else
            {
                lra = new RecycledLongRunningAction
                {
                    iter = longRunningAction,
                    maxMillisecondsUsedPerFrame = maxMillisecondsUsedPerFrame
                };
            }

            return(lb.Add(lra));
        }
 private static void Return(RecycledLongRunningAction action)
 {
     action.iter = null;
     _longActions.Enqueue(action);
 }