سؤال

أنا أستخدم C# مع Compact Framework 2، SP2.

تم إعداد نظام التشغيل الخاص بالجهاز لبدء تشغيل تطبيقي، فلنسمي التطبيق "Loader.exe".

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

لذا فإن منشئ نموذج Loader لديه ما يلي في جداً نهاية:

try
{
    label1.Text = "Starting GUI Init Thread...";  //debug only message
    System.Threading.Timer guiInit = new System.Threading.Timer(
        RunStateMachine, null, 2000, System.Threading.Timeout.Infinite
        );
    //callback: RunStateMachine, null argument
    //initial callback is 2000ms from this point, and doesn't run again.
}
catch (Exception ex1)
{
    label1.Text = "GUI Init Error 2";
    Failure_Label.Text = ex1.Message;
}

ويعمل "RunStateMachine" على مؤشر ترابط مختلف عن واجهة المستخدم، مما يسمح بعرض النموذج، وفي أي وقت يحتاج RunStateMachine إلى التفاعل مع النموذج، مثل تحديث الرسائل، أقوم باستدعاء وظيفة تستخدم if(this.InvocRequired){this .Invoc(...);} آخر{...}

إذن مشكلتي؟
بشكل متقطع، سوف يتعطل برنامجي، وذلك لأن المؤقت لم يطلق رد اتصال.أضفت في رسالة التصحيح في كتلة المحاولة أعلاه ، إلى جانب العديد من الأماكن الأخرى لأخبرني أين تعلق ، بما في ذلك رسالة في بداية "RunStatemachine". في نهاية المطاف ، علقت برنامجي على الرسالة "بدء واجهة المستخدم الرسومية لاتخاذ موضوع ..."

يخبرني هذا أن مؤقت الخيط لا يعمل على واحد الوقت الذي أحتاجه لذلك.
نظريتي هي أنه يتم جمع البيانات المهملة قبل أن يقوم المؤقت بتشغيل رد الاتصال.وهذا يعني أنه إذا كان المؤقت عالميًا، ثم تم التخلص منه بشكل صريح عندما أصل إلى RunStateMachine، فإنه سيعمل بشكل مثالي ...لكنني لا أريد أن أعتقد أنني قمت بحلها فقط لأجد أن هذا سيظهر بشكل متقطع بعد شهر من الآن.

أفكار؟

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

المحلول

نظريتي هي أنه يجري جمع القمامة قبل الموقت الذي يؤدي إلى رد الاتصال.هذا يعني أنه إذا كان المؤقت عالميًا ، ثم يتم التخلص منه بشكل صريح عندما أحصل على Runstatemachine ، فسيتم تشغيله تمامًا ...لكنني لا أريد أن أعتقد أنني حللت ذلك فقط للعثور على هذا الأمر بشكل متقطع بعد شهر من الآن.

يبدو أنك تريد التأكيد على أن هذه هي مشكلتك. نعم، هذه هي المشكلة.

يتم تخزين المؤقت في متغير محلي لا يتم استخدامه مرة أخرى أبدًا.وهذا يجعلها مؤهلة للحصول على GC.يؤدي GC'ing للمؤقت إلى الانتهاء مما يؤدي إلى تعطيل المؤقت.

أقترح عليك تخزين المؤقت في حقل مثيل لفئة النموذج الخاصة بك وإزالته من هناك بمجرد تشغيل رد الاتصال.

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