public static void DoRunAllPending() { List <CallBackAndState> holdFunctionsToCallOnIdle = new List <CallBackAndState>(); // make a copy so we don't keep this locked for long using (TimedLock.Lock(functionsToCallOnIdle, "PendingUiEvents AddAction()")) { long currentMilliseconds = timer.ElapsedMilliseconds; for (int i = functionsToCallOnIdle.Count - 1; i >= 0; i--) { CallBackAndState callBackAndState = functionsToCallOnIdle[i]; if (callBackAndState.absoluteMillisecondsToRunAt <= currentMilliseconds) { holdFunctionsToCallOnIdle.Add(new CallBackAndState(callBackAndState.idleCallBack, callBackAndState.stateInfo, callBackAndState.absoluteMillisecondsToRunAt)); functionsToCallOnIdle.RemoveAt(i); } } } // now call all the functions (we put them in backwards to make it easier to remove them as we went so run them backwards for (int i = holdFunctionsToCallOnIdle.Count - 1; i >= 0; i--) { CallBackAndState callBackAndState = holdFunctionsToCallOnIdle[i]; callBackAndState.idleCallBack(callBackAndState.stateInfo); } }
public static void InvokePendingActions() { List <Action> callThisCycle = callNextCycle; List <CallBackAndState> holdFunctionsToCallOnIdle = new List <CallBackAndState>(); // make a copy so we don't keep this locked for long lock (functionsToCheckIfTimeToCall) { callNextCycle = new List <Action>(); long currentMilliseconds = timer.ElapsedMilliseconds; for (int i = functionsToCheckIfTimeToCall.Count - 1; i >= 0; i--) { CallBackAndState callBackAndState = functionsToCheckIfTimeToCall[i]; if (callBackAndState.absoluteMillisecondsToRunAt <= currentMilliseconds) { holdFunctionsToCallOnIdle.Add(callBackAndState); functionsToCheckIfTimeToCall.RemoveAt(i); } } } foreach (Action action in callThisCycle) { action?.Invoke(); } // now call all the functions (we put them in backwards to make it easier to remove them as we went so run them backwards for (int i = holdFunctionsToCallOnIdle.Count - 1; i >= 0; i--) { CallBackAndState callBackAndState = holdFunctionsToCallOnIdle[i]; callBackAndState.idleCallBack(callBackAndState.stateInfo); } }