/// <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); }