بسم الله الرحمن الرحيم
أولا ما هو الاستدعاء التبادلي ؟
هو أن يكون لدينا أجراءان أو أكثر وتستدعي بعضها البعض
كمثال : ليكن لدينا المنهجان 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
}
أو
التعليقات