Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
            }
        }