public CallbackInfo(IDelegateAction callback, Vector3 pos, Vector3 forward, GameObject parent)
 {
     this.callback = callback;
     this.pos      = pos;
     this.forward  = forward;
     this.parent   = parent;
 }
    // Update is called once per frame
    void Update()
    {
        Debug.Log("===================BetterDelegate Callback===================");
        Profiler.BeginSample("BetterDelegate Callback");
        for (int i = 0; i < (isTestingCorrectness ? 10 : 10000); i++)
        {
            if (i % 3 == 0)
            {
                IDelegateAction bDelegate = BetterDelegate.GetAction(mDel1, inputNames[i], i);
                bDelegate.Invoke((object)outputNames[i], 1111);
            }
            else
            {
                IDelegateAction bDelegate = BetterDelegate.GetAction(mDel2, (object)inputNames[i], i, inputNames[i]);
                bDelegate.Invoke((object)outputNames[i], 2222, outputNames[i]);
            }
        }
        Profiler.EndSample();

        Debug.Log("===================Directly Call===================");
        Profiler.BeginSample("Directly Call");
        for (int i = 0; i < (isTestingCorrectness ? 10 : 10000); i++)
        {
            if (i % 3 == 0)
            {
                TestCallback(outputNames[i], 1111, inputNames[i], i);
            }
            else
            {
                TestCallback(outputNames[i], 2222, outputNames[i], inputNames[i], i, inputNames[i]);
            }
        }
        Profiler.EndSample();

        Debug.Log("===================Cache Delegate Genericity Callback===================");
        Profiler.BeginSample("Cache Delegate Genericity Callback");
        for (int i = 0; i < (isTestingCorrectness ? 10 : 10000); i++)
        {
            if (i % 3 == 0)
            {
                TestDe(mDel1, outputNames[i], 1111, inputNames[i], i);
            }
            else
            {
                TestDe(mDel2, outputNames[i], 2222, outputNames[i], inputNames[i], i, inputNames[i]);
            }
        }
        Profiler.EndSample();

        Debug.Log("===================Cache Delegate Function Callback===================");
        Profiler.BeginSample("Cache Delegate Function Callback");
        for (int i = 0; i < (isTestingCorrectness ? 10 : 10000); i++)
        {
            if (i % 3 == 0)
            {
                TestDeCall(mDel1, outputNames[i], 1111, inputNames[i], i);
            }
            else
            {
                TestDeCall(mDel2, outputNames[i], 2222, outputNames[i], inputNames[i], i, inputNames[i]);
            }
        }
        Profiler.EndSample();

        Debug.Log("===================No Cache Delegate Genericity Callback===================");
        Profiler.BeginSample("No Cache Delegate Genericity Callback");
        for (int i = 0; i < (isTestingCorrectness ? 10 : 10000); i++)
        {
            if (i % 3 == 0)
            {
                TestDe(TestCallback, outputNames[i], 1111, inputNames[i], i);
            }
            else
            {
                TestDe(TestCallback, outputNames[i], 2222, outputNames[i], inputNames[i], i, inputNames[i]);
            }
        }
        Profiler.EndSample();

        if (callNum < 10)
        {
            callNum++;
            Debug.Log("===================Test async conrrectness===================");
            CallbackInfo callbackInfo = default(CallbackInfo);
            callbackInfo.forward = new Vector3(callNum, callNum, callNum);
            IDelegateAction btDelegate = BetterDelegate.GetAction(mDel3, callbackInfo, "inTestString");
            testClass.InvokeDelegate(btDelegate);
            // 用协程模拟异步
            StartCoroutine("InvokeTrigger");
        }
        else if (callNum < 20)
        {
            callNum++;
            Debug.Log("===================Test thread conrrectness===================");
            CallbackInfo callbackInfo = default(CallbackInfo);
            callbackInfo.forward = new Vector3(callNum, callNum, callNum);
            IDelegateAction btDelegate = BetterDelegate.GetAction(mDel3, callbackInfo, "inTestString");
            invokeQueue.Enqueue(btDelegate);
        }
        else
        {
            // 启动子线程,测试回调
            threadStart = true;
        }
    }
 public void InvokeDelegate(IDelegateAction delFun)
 {
     invokeQueue.Enqueue(delFun);
 }