بسم الله الرحمن الرحيم

أولا ما هو الاستدعاء التبادلي ؟

هو أن يكون لدينا أجراءان أو أكثر وتستدعي بعضها البعض

كمثال : ليكن لدينا المنهجان Method1 , Method2

ولنفرض أنه يتم استدعاء Method2 من داخل Method1

والعكس أي يتم استدعاء Method1 من داخل Method2

فهذا سيولد حالة الاستدعاء الدوراني Circular Calling وسينتهي الأمر باستثناء طفحان المكدس

إذا فما الحل ؟

الحل ببساطة هو عمل حماية ذاتية

كيف ؟

نصرح عن متحول بولياني يعبر عن المنهج بحيث يتم جعله بقيمة true قبل استدعاء المنهج الآخر و ونعيده إلى false بعد العودة منه

وطبعا قبل هذا نفحص قيمة هذا المتحول بحيث إذا كان true نقفز ، لأن هذا يعني أن الاستدعاء الأول بدأ من هنا وهذا هو الدخول الثاني فنتجاوزه، وبهذا نتجنب الاستدعاء من جديد وسيعود للمنهج الثاني ينهيه ويرجع

هذه الحالة تصادفنا أحيانا عندما نريد تحديث قيمة خاصية كلما تغيرت خاصية ما والعكس بالعكس

أو خذوا مثالا عندما تريد تغيير قيمة صندوق نص عندما تتغير صندوق نص آخر بتعديل القيمة ضمن حدث TextChanged مما تغيير القيمة سيولد حدث TextChanged للصندوق الآخر والآخر يولد الحدث للأول وندخل في متاهة الاستدعاء المتداخل

كما قد تحدث من أجل الإشعار بتغير الخصائص من خلال حدث OnPropertyChanged التي نستخدمها بكثرة في تطبيقات WPF Xaml

كتطبيق للطريقة :

    bool isMethod1, isMethod2;


    public void Method1()
    {
        // Some code
        if(!isMethod1)
        {
            isMethod1 = true;
            Method2();
            isMethod1 = false;
        }
        // Some code
    }



    public void Method2()
    {
        // Some code
        if(!isMethod2)
        {
            isMethod2 = true;
            Method1();
            isMethod2 = false;
        }
        // Some code
    }

أو