public void Add(ITriggerHandler <T> handler) { if (isRunning) { if (waitHandler == null) { waitHandler = handler; return; } if (waitQueue == null) { waitQueue = new MinimumQueue <ITriggerHandler <T> >(4); } waitQueue.Enqueue(handler); return; } if (singleHandler == null) { singleHandler = handler; } else { if (handlers == null) { handlers = new ITriggerHandler <T> [4]; } // check empty for (int i = 0; i < handlers.Length; i++) { if (handlers[i] == null) { handlers[i] = handler; return; } } // full, ensure capacity var last = handlers.Length; { EnsureCapacity(ref handlers); handlers[last] = handler; } } }
/// <summary>Add Cancellation Triggers on destroy</summary> public void AddCancellationTriggerOnDestory(CancellationTokenSource cts) { if (called) { cts.Cancel(); cts.Dispose(); } if (canellationTokenSourceOrQueue == null) { canellationTokenSourceOrQueue = cts; } else if (canellationTokenSourceOrQueue is CancellationTokenSource c) { var q = new MinimumQueue<CancellationTokenSource>(4); q.Enqueue(c); q.Enqueue(cts); canellationTokenSourceOrQueue = q; } else { ((MinimumQueue<CancellationTokenSource>)canellationTokenSourceOrQueue).Enqueue(cts); } }
public LogicLooper(TimeSpan targetFrameTime, int initialActionsCapacity = 16) { _targetFrameRate = 1000 / targetFrameTime.TotalMilliseconds; _looperId = Interlocked.Increment(ref _looperSequence); _ctsLoop = new CancellationTokenSource(); _ctsAction = new CancellationTokenSource(); _targetFrameTimeMilliseconds = (int)targetFrameTime.TotalMilliseconds; _registerQueue = new MinimumQueue <LooperAction>(10); _runLoopThread = new Thread(StartRunLoop) { Name = $"{typeof(LogicLooper).Name}-{_looperId}", IsBackground = true, Priority = ThreadPriority.AboveNormal, }; _shutdownTaskAwaiter = new TaskCompletionSource <bool>(); _actions = new LooperAction[initialActionsCapacity]; _runLoopThread.Start(this); }