void _Interrupt(CanInterruptHandler handler) { var count = _stack.Count; if (count == 0) { return; } // 查找 n, 使得 [0, n) 之间的 TaskUnit 可以被停止 int n = 0; for (n = 0; n < count; n++) { var u = _stack[n]; var can_interrupt = handler(u.data); if (!can_interrupt) { break; } } // 删除 [0, n) 之间的 TaskUnit if (n > 0) { TaskUnit[] arr = new TaskUnit[n]; _stack.CopyTo(0, arr, 0, n); _stack.RemoveRange(0, n); foreach (var u in arr) { u.InvokeLeave(); } } }
// 中断当前任务, 执行新任务 e public void Interrupt(IEnumerator e, CanInterruptHandler handler) { // 中断之前的任务 if (handler != null) { _Interrupt(handler); } // _Start(e, false); }