سؤال

لدي نموذج كود صغير:

private void MonitorItems()
        {
            if (someCondition)
            {
                dateSelected = DateTime.Now;
                GetAllItems();
            }
            else
            {
                if(allItems.Count>0)
                    CheckAllItems();
            }
            MonitorItems();
        }

تنتقل طريقة GetAllItems إلى قاعدة البيانات وتحصل على كافة العناصر الجديدة للمجموعة -> allItems.ثم طريقة CheckAllItems:

private void CheckAllItems()
        {
            foreach (Item a in new List<Item>(allItems))
            {
                switch (a.Status)
                {
                    case 1:
                        HandleStatus1();
                        break;
                    case 2:
                        HandleStatus2(a);
                        break;
                    case 0:
                        HandleStatus0(a);
                        break;
                    default:
                        break;
                }
            }  
        }

في بعض الحالات (في HandleStatus1 وHandleStatus2) أحتاج إلى الانتقال إلى قاعدة البيانات، وإجراء بعض التحديثات، ثم ملء المجموعة allItems مرة أخرى من خلال استدعاء الأسلوب GetAllItems.

يقوم هذا النوع من التعليمات البرمجية بطرح استثناء Stack.Overflow في WinFormsApp.لدي سؤالان:
1.هل سيتم طرح هذا النوع من الاستثناء في تطبيق WinService باستخدام نفس الكود؟
2.ما رأيك في استخدام الموقتات بدلاً من طريقة الاتصال الذاتي؟

هل كانت مفيدة؟

المحلول

وA "أسلوب الدعوة الذات" وتسمى الاصح "طريقة العودية" . الحل هو الخلاق، سأعطيك ذلك. ولكن لا تفعل ذلك. مساحة مكدس محدودة للغاية. سترى هذه المشكلة عند الانتقال إلى خدمة، وهناك طرق أفضل بكثير من التعامل مع هذا. جهاز توقيت مناسب جدا عند استخدامها في الخدمة.

نصائح أخرى

استدعاء العودية الطريقة في حالتك هي كما يلي سيء مثل استخدام جهاز توقيت للقيام بذلك.لا ينبغي عليك أن تفعل أياً منهما!!

ما عليك سوى استخدام حلقة بسيطة وإرسال الخيط في وضع السكون لبعض الوقت بينهما.

وMS IL ديه كود المرجع .tail. ولكن ج # نقطة تريد أن تعترف ذيل عودية (وبالمناسبة، الذيل العودية بطيئة جدا في صافي ((

وماذا تحتاج لعنة على الإطلاق؟ لا يوجد بيان التحكم في التدفق من شأنها أن تسمح طريقة لوقف recursing والخروج من السلسلة. وrecursions لانهائية وربما ما هو الذي يسبب تجاوز. سيكون الحل الأفضل للتخلص من العودية تماما. إزالة آخر المجمع يحقق نفس النتيجة دون الحاجة إلى لعنة:

private void MonitorItems()
{
    if(someCondition)
    {
        dateSelected = DateTime.Now;
        GetAllItems();
    }
    if(allItems.Count>0)
        CheckAllItems();
}

وهذا سوف يحقق نفس النتيجة دون أن يعلقوا في حلقة. ثم يمكنك تطبيق قواعد لتكرار الدعوة في سياق بيئة تنفيذ: النقر على زر في نموذج أو جهاز توقيت في تطبيق خدمة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top