Beispiel #1
0
    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();
            }
        }
    }
Beispiel #2
0
    // 中断当前任务, 执行新任务 e
    public void Interrupt(IEnumerator e, CanInterruptHandler handler)
    {
        // 中断之前的任务
        if (handler != null)
        {
            _Interrupt(handler);
        }

        //
        _Start(e, false);
    }