سؤال

ما أعرفه عن Application.Idle الحدث هو أن التطبيق على وشك الانتهاء من معالجته وعلى وشك الدخول في حالة الخمول.

قرأت ذلك في مكان ما

إذا كانت لديك مهام يجب أن تؤديها قبل أن يصبح الخيط خاملاً ، فقم بإرفاقها بهذا الحدث

فهل هذا يعني أنه سيتم تنفيذ المهام قبل أن يصبح الخيط خاملاً أم بعد أن يصبح الخيط خاملاً؟

لدي القليل من التعليمات البرمجية في مشروعي، كما هو موضح أدناه.هل يتم تنفيذ تحديث قاعدة البيانات أثناء وقت الخمول؟

private void Application_Idle(object sender, EventArgs e)
{
    // Update the explorer's menuitems
    team.UpdateMenu();

    // Update display toolbars.
    team.UpdateToolBar();

    // Update SaveAll
    SaveAll.Enabled = teaj.IsModified;

    Up.Enabled = team.CanNavigateUp;
    ...
هل كانت مفيدة؟

المحلول

أولاً، افهم أن Application.Idle موجود لا حول "مؤشر الترابط الخامل" ولكن حول معالجة الرسائل في مؤشر ترابط واجهة المستخدم الخاص بالتطبيق.(يختلف مؤشر الترابط الخامل عن حلقة الرسائل الخاملة)

يتم تشغيل تطبيق WinForms الخاص بك بواسطة حلقة رسائل تسحب الرسائل من قائمة الانتظار.عندما يتم إفراغ قائمة الانتظار هذه، تدخل حلقة الرسالة في حالة هادئة، وتنام بكفاءة حتى تظهر الرسالة التالية في قائمة انتظار الرسائل.يساعد هذا في الحفاظ على موارد معالجة وحدة المعالجة المركزية (دورات الدوران الضائعة في حلقة تستغرق وقت وحدة المعالجة المركزية بعيدًا عن العمليات الأخرى التي يتم تشغيلها على الجهاز، لذلك يبدو كل شيء أبطأ) ويساعد أيضًا في تقليل استهلاك الطاقة / إطالة عمر بطارية الكمبيوتر المحمول.

عادةً ما تستنفد حلقة رسائل تطبيقك تراكم قائمة انتظار الرسائل بشكل متكرر إلى حد ما - حتى بين ضغطات المفاتيح عندما تكتب في مربع التحرير.

أصبح حدث Application.Idle مكانًا مناسبًا للاهتمام بمهام التدبير المنزلي للتطبيق بشكل غير متزامن مع العمليات الأساسية للتطبيق، ودون التورط في سلاسل رسائل متعددة.

عادةً ما يتم تمكين أو تعطيل القوائم والأزرار لتتناسب مع حالات الأوامر المقابلة لها عندما يصبح التطبيق خاملاً، على سبيل المثال.نظرًا لأن المظهر المرئي يحتاج فقط إلى التحديث في وقت المستخدم (لا يمكن للمستخدم تمييز الفرق بين تغييرات الحالة المرئية بالضبط في وقت تغيرات الحالة الداخلية مقارنة بتغيير الحالة المرئية بعد بضعة أجزاء من الثانية)، فإن حدث خمول التطبيق هو فرصة بسيطة وفعالة للقيام بهذه الأعمال المنزلية.

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

ضع في اعتبارك أيضًا أن معدل تشغيل الحدث Application.Idle متغير بدرجة كبيرة - فقد يتم تشغيله عدة مرات في الثانية أو قد لا يتم تشغيله لعدة ثوانٍ، اعتمادًا على ما يفعله المستخدم والتطبيق الخاص بك.إذا كنت تريد التحقق من تحديثات البيانات وفقًا لجدول منتظم، فيجب عليك استخدام حدث مؤقت بدلاً من Application.Idle.إذا قمت ببدء طلب شبكة غير متزامن في كل مرة يتم فيها تشغيل Application.Idle، فقد يؤدي ذلك إلى إغراق الخادم الخاص بك بالكثير من الطلبات (المتكررة) في الثانية.

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